Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch Straße und Hausnummer trennen

Frage Entwicklung Batch & Shell

Mitglied: Pfnuesel

Pfnuesel (Level 1) - Jetzt verbinden

20.05.2010 um 09:59 Uhr, 3621 Aufrufe, 14 Kommentare

Hallo zusammen

Ich übergebe über ein ERP verschiedene Anschrifts-Variablen in eine Batch-Datei, wo diese verarbeitet werden sollen um sie dann per URL an eine API weiterzugeben.
Bisher bin ich recht gut vorwärts gekommen, jedoch habe ich nun folgendes Problem:

Unser ERP speichert Straße und Hausnummer in einem String, die API möchte aber das Ganze getrennt erhalten.

Wäre nun das Straßenformat einheitlich (z.B. "Bahnhofstraße 1"), wäre es keine große Sache. Aber weil es halt diverse Formate gibt (z.B. "Klaus Johann Straße 19", "1. Mai Straße 14", etc.) stehe ich etwas an.

Über folgende Formel komm ich an die Straße ran:

01.
FOR /F "tokens=1 delims=1234567890" %%i in ("%Strasse%") do set Street=%%i
Wie komme ich jetzt aber an die Hausnummer ran? Wenn ich mit delims nach Nummern suche, werden diese ja ausgeblendet.

Bin leider absoluter Neuling in der Batch-Programmierung und hoffe dass mir jemand helfen kann.

Vielen Dank
Pfnuesel
Mitglied: bastla
20.05.2010 um 10:03 Uhr
Hallo Pfnuesel und willkommen imForum!

Versuch es mal so:
FOR %%i in (%Strasse%) do set "Nr=%%i"
Grüße
bastla
Bitte warten ..
Mitglied: Pfnuesel
20.05.2010 um 10:11 Uhr
Hallo bastla

Super, funktioniert! Vielen Dank!

Noch eine Frage
Gibt es für meine obige Formel eine sauberere Lösung als delims=1234567890?

Gruss
Pfnuesel
Bitte warten ..
Mitglied: bastla
20.05.2010 um 10:25 Uhr
Hallo Pfnuesel!

Vielleicht so (als Demo):
01.
@echo off & setlocal 
02.
set "Strasse=Klaus Johann Straße 19" 
03.
 
04.
for %%i in (%Strasse%) do set "Nr=%%i" 
05.
 
06.
set "Street=%Strasse%" 
07.
set "L=True" 
08.
:Loop 
09.
echo #%Street%# 
10.
if "%Street:~-1%"==" " set "L=" 
11.
set "Street=%Street:~,-1%" 
12.
if defined L goto :Loop 
13.
 
14.
echo #%Street%#%Nr%#
Ein direktes Ersetzen der Nummer und des davor liegenden Leerzeichens durch "Nichts" wäre eine andere, allerdings weniger sichere Variante (würde zB nicht funktionieren für "Straße des 1. Mai 1"):
01.
@echo off & setlocal 
02.
set "Strasse=Klaus Johann Straße 19" 
03.
 
04.
for %%i in (%Strasse%) do set "Nr=%%i" 
05.
call set "Street=%%Strasse: %Nr%=%%" 
06.
 
07.
echo #%Street%#%Nr%#
[Edit]
Wie LotPings richtig angemerkt hat, setzt diese Vorgangsweise voraus, dass sich vor der Hausnummer ein Leerzeichen befindet. Das Beispiel "1. Mai Straße 14" zeigt aber, dass auch das Trennen anhand der Ziffern keine wasserdichte Lösung ergeben muss.
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: Loeffelstiel
20.05.2010 um 10:31 Uhr
MoinMoin @all,

mit einer Batch-Lösung wirds aber schwierig, man denke nur an Hausnummern wie 11a, 12a-d oder 69-73 oder Postschließfachnummern ......
Bitte warten ..
Mitglied: LotPings
20.05.2010 um 10:31 Uhr
Zitat von Pfnuesel:
Auch von mir ein Willkommen.
Noch eine Frage
Gibt es für meine obige Formel eine sauberere Lösung als delims=1234567890?
So schlecht ist der Ansatz nicht.
Wenn z.Bsp. die Hausnummer unmittelbar auf die Straße folgt wie bei:
Kaiserstr.25
greift bastlas Ansatz nicht.

Die Nummer kannst du aus Strasse gewinnen indem du den Inhalt von Street aus Strasse löscht.
01.
@Echo off 
02.
Set Strasse=Kaiserstr.25 
03.
FOR %%i in (%Strasse%) do set "Nr=%%i" 
04.
FOR /F "tokens=1 delims=1234567890" %%i in ("%Strasse%") do set Street=%%i 
05.
Call Set Num=%%Strasse:%Street%=%%% 
06.
Echo 1. Nr:[%Nr%] 2. Num:[%Num%]
Der Pseudo call bewirkt, das zuerst der Inhalt von Street eingetragen und erst dann die Ersetzung ausgeführt wird.

Gruß
LotPings
Bitte warten ..
Mitglied: bastla
20.05.2010 um 10:33 Uhr
@Loeffelstiel
Ohne ein geeignetes Kriterium (ich habe oben einmal ein Leerzeichen vor der Nummer angenommen) wird das in keiner Sprache leicht sein ...

Grüße
bastla
Bitte warten ..
Mitglied: LotPings
20.05.2010 um 10:52 Uhr
Zitat von bastla:
Ohne ein geeignetes Kriterium (ich habe oben einmal ein Leerzeichen vor der Nummer angenommen) wird das in keiner Sprache leicht sein ...

Ack,

man könnte aber auch als Extrembeispiel per Batch und wget ein Webformular füllen
und eine Adressabfrage starten und auswerten

Gruß
LotPings
Bitte warten ..
Mitglied: Pfnuesel
20.05.2010 um 11:03 Uhr
Hallo zusammen

Vielen Dank für die Willkommensgrüße und die vielen sehr hilfreichen Antworten!

Mit bastla's erster Vorschlag funktioniert soweit fast alles mit unserem System; sowohl 11a wie auch 12a-d etc.
Postfachschließnummern werden in einem anderen ERP-Feld gespeichert und Einträge wie "Strasse5", also ohne Leerzeichen, sollten nicht vorhanden sein.

Ab und an tritt noch folgendes Problem ein und zwar bei Straßen, die über keine Nummer verfügen:

Bei der Straße "Ebnet" kommt gar kein Eintrag zurück. Wenn ich eine 5 dazu setze, geht es wieder.
Bei der Straße "In der Grünau" setzt er Grünau zu der Hausnummer -> Ausgabe also Strasse = "In der", Nr. = "Grünau". Evtl. wegen dem Umlaut ü?

Hat da noch jemand eine gute Lösung?

Danke und Gruss
Pfnuesel
Bitte warten ..
Mitglied: LotPings
20.05.2010 um 11:17 Uhr
Hat da noch jemand eine gute Lösung?

Wie du aus den Kommentaren gesehen hast, wird dir kein Ansatz eine manuelle Nachbearbeitung ersparen.
Mein Vorschlag hat mit Zahlen innerhalb der Strasse ein Problem, packt aber den Rest in die Hausnummer.

Du kannst ja die Stellenzahle der Nr prüfen z.Bsp. mit

If "%Nr:~10,1%" NEQ "" echo mit Nr %Nr% stimmt was nicht

Gruß
LotPings
Bitte warten ..
Mitglied: bastla
23.05.2010 um 15:24 Uhr
Hallo Pfnuesel!

Mit etwas Verspätung, vermutlich noch Optimierungspotenzial und immer noch darauf basierend, dass unmittelbar vor der Hausnummer ein Leerzeichen steht (deswegen auch in der ersten Fassung keine Zerlegung bei "Ebnet" und die Interpretation von "Grünau" als Nr):
01.
@echo off & setlocal 
02.
set "Strasse=In der Grünau" 
03.
 
04.
for %%i in (%Strasse%) do set "Nr=%%i" 
05.
for /f "tokens=2" %%i in ("%Strasse%") do goto :Weiter 
06.
goto :NurStrasse 
07.
:Weiter 
08.
echo "%Nr%"|findstr "[0-9]">nul || goto :NurStrasse 
09.
 
10.
set "Street=%Strasse%" 
11.
set "L=True" 
12.
:Loop 
13.
    if "%Street:~-1%"==" " set "L=" 
14.
    set "Street=%Street:~,-1%" 
15.
if defined L goto :Loop 
16.
goto :Fertig 
17.
 
18.
:NurStrasse 
19.
set "Nr=" 
20.
set "Street=%Strasse%" 
21.
goto :Fertig 
22.
 
23.
:Fertig 
24.
echo #%Street%#%Nr%#
Es sollte jetzt jede Angabe ohne enthaltenes Leerzeichen als Straße behandelt werden und zusätzlich, auch bei Vorhandensein eines Leerzeichens, nur eine Trennung versucht werden, wenn nach dem letzten Leerzeichen noch mindestens eine Ziffer folgt.

Grüße
bastla
Bitte warten ..
Mitglied: Pfnuesel
24.05.2010 um 00:50 Uhr
Hallo bastla!

Vielen vielen Dank für Deine Hilfe - Deine Lösung funktioniert super, hab es gerade erfolgreich mit rund 100 Adressen durchprobiert.

Ein kleines Problem habe ich allerdings noch, dies betrifft allerdings nicht die Strasse, sondern den Namen von Firmen.
Wir haben einige Firmen in der Datenbank, welche ein Ampersand im Namen haben (z.B. "Max & Moritz GmbH") - Als Ausgabe erhalte ich dann einen Syntaxfehler.

Meine Quellcode bis dahin:
01.
set Adresse=%*   // Erfolgt im Format Name;Strasse;PLZ;Ort 
02.
 
03.
FOR /F "tokens=1 delims=;" %%i in ("%Adresse%") do set Name=%%i 
04.
FOR /F "tokens=2 delims=;" %%i in ("%Adresse%") do set Strasse=%%i 
05.
[...]
Ich wollte danach eine Überprüfung auf das Ampersand durchführen mit einer Ersetzung in "und", allerdings wird der String anscheinend vor dem Ampersand unterbrochen (also %Name% = "Max "), wodurch diese Möglichkeit nicht geht.

01.
echo %Name%|findstr "&">nul || goto :Negativ
Gibt es für BATCH-Files auch so was wie eine Formel, wodurch alle mathematischen Zeichen innerhalb eines Strings unbeachtet bleiben?
Hab bereits lange gegoogelt, aber diesbezüglich noch keine Lösung gefunden, weswegen ich Dich nochmals um Hilfe bitten muss.

Vielen Dank und Gruss
Pfnuesel
Bitte warten ..
Mitglied: bastla
24.05.2010 um 00:58 Uhr
Hallo Pfnuesl!

Einige Sonderzeichen ("<|>&") haben in Batch eine besondere Bedeutung und müssen daher "maskiert" werden - zumindest, wenn sie nicht unter Anführungszeichen stehen, daher besser:
... set "Name=%%i"
Der Interpreter wird durch das Voranstellen von "^" angewiesen, das folgende Zeichen als gewöhnlichen Text zu behandeln - das sähe dann so aus:
01.
set Adresse=%*   // Erfolgt im Format Name;Strasse;PLZ;Ort 
02.
 
03.
FOR /F "tokens=1 delims=;" %%i in ("%Adresse%") do set "Name=%%i" 
04.
:: "&" behalten 
05.
set "Name=%Name:&=^&" 
06.
:: oder Ersetzung durch "und" 
07.
:: set "Name=%Name:&=und%"
Die Überprüfung sollte übrigens auch ohne Ersetzung mit
echo "%Name%"|findstr "&">nul || goto :Negativ
klappen (gefunden wird das "&" ja auch zwischen den Anführungszeichen) ...

Grüße
bastla
Bitte warten ..
Mitglied: Pfnuesel
24.05.2010 um 04:15 Uhr
Hallo bastla!

Bin jetzt mitten in der Nacht mit der Lösung aufgewacht - Das Problem kann auch schon zuvor im ERP stattfinden und nicht erst im Batch-File. Bin deswegen extra aufgestanden um es durchzuprobieren, bevor Du oder jemand anderes sich dem Problem annimmt, aber Du warst wieder zu schnell .
Das Problem findet anscheinend wirklich im ERP statt, so dass nach dem Ampersand keine weitere Daten an das Batch-File gesendet werden. ECHO %* (und auch in Anführungszeichen und mit ^) ergibt demnach nur noch "Max " statt "Max & Moritz GmbH, Strasse 5, 98765 Hausen". Muss das Problem also schon zuvor im ERP lösen.

Nochmals vielen Dank für Deine Hilfe.
Auch bei meinen vorhergegangen Google-Suchen bin ich auf viele hilfreiche Antworten von Dir und Biber gestossen (weswegen ich mich letzlich auch hier anmeldete). Solche User wie Du sind wirklich ein Segen für ein Forum, die so schnell, umfassend, profesionell und freundlich antworten - Eigenschaften, die man sonst leider nur selten in kostenfreien Foren antrifft, was mitunter auch der Grund ist, wieso das der erste Forenpost von mir seit Jahren ist, da ich mich ansonsten gänzlich auf Google verlasse.

Somit Daumen hoch für Dich und das Forum.

Gruss
Pfnuesel
Bitte warten ..
Mitglied: bastla
24.05.2010 um 19:04 Uhr
Hallo Pfnuesl!

Freut mich, dass wir helfen konnten ...

... und danke für die freundlichen Worte.

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch zum bearbeiten mehrerer CSV (3)

Frage von Matzus87 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...