pfnuesel
Goto Top

Batch Straße und Hausnummer trennen

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:

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

Content-Key: 143197

Url: https://administrator.de/contentid/143197

Printed on: April 25, 2024 at 11:04 o'clock

Member: bastla
bastla May 20, 2010 at 08:03:53 (UTC)
Goto Top
Hallo Pfnuesel und willkommen imForum!

Versuch es mal so:
FOR %%i in (%Strasse%) do set "Nr=%%i"
Grüße
bastla
Member: Pfnuesel
Pfnuesel May 20, 2010 at 08:11:09 (UTC)
Goto Top
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
Member: bastla
bastla May 20, 2010 at 08:25:48 (UTC)
Goto Top
Hallo Pfnuesel!

Vielleicht so (als Demo):
@echo off & setlocal
set "Strasse=Klaus Johann Straße 19"  

for %%i in (%Strasse%) do set "Nr=%%i"  

set "Street=%Strasse%"  
set "L=True"  
:Loop
echo #%Street%#
if "%Street:~-1%"==" " set "L="  
set "Street=%Street:~,-1%"  
if defined L goto :Loop

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"):
@echo off & setlocal
set "Strasse=Klaus Johann Straße 19"  

for %%i in (%Strasse%) do set "Nr=%%i"  
call set "Street=%%Strasse: %Nr%=%%"  

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
Member: Loeffelstiel
Loeffelstiel May 20, 2010 at 08:31:09 (UTC)
Goto Top
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 ......
Mitglied: 77559
77559 May 20, 2010 at 08:31:33 (UTC)
Goto Top
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.
@Echo off
Set Strasse=Kaiserstr.25
FOR %%i in (%Strasse%) do set "Nr=%%i"  
FOR /F "tokens=1 delims=1234567890" %%i in ("%Strasse%") do set Street=%%i  
Call Set Num=%%Strasse:%Street%=%%%
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
Member: bastla
bastla May 20, 2010 at 08:33:49 (UTC)
Goto Top
@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
Mitglied: 77559
77559 May 20, 2010 at 08:52:46 (UTC)
Goto Top
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 face-wink

Gruß
LotPings
Member: Pfnuesel
Pfnuesel May 20, 2010 at 09:03:12 (UTC)
Goto Top
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
Mitglied: 77559
77559 May 20, 2010 at 09:17:05 (UTC)
Goto Top
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
Member: bastla
bastla May 23, 2010 at 13:24:05 (UTC)
Goto Top
Hallo Pfnuesel!

Mit etwas face-wink 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):
@echo off & setlocal
set "Strasse=In der Grünau"  

for %%i in (%Strasse%) do set "Nr=%%i"  
for /f "tokens=2" %%i in ("%Strasse%") do goto :Weiter  
goto :NurStrasse
:Weiter
echo "%Nr%"|findstr "[0-9]">nul || goto :NurStrasse  

set "Street=%Strasse%"  
set "L=True"  
:Loop
    if "%Street:~-1%"==" " set "L="  
    set "Street=%Street:~,-1%"  
if defined L goto :Loop
goto :Fertig

:NurStrasse
set "Nr="  
set "Street=%Strasse%"  
goto :Fertig

:Fertig
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
Member: Pfnuesel
Pfnuesel May 23, 2010 at 22:50:45 (UTC)
Goto Top
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:
set Adresse=%*   // Erfolgt im Format Name;Strasse;PLZ;Ort

FOR /F "tokens=1 delims=;" %%i in ("%Adresse%") do set Name=%%i  
FOR /F "tokens=2 delims=;" %%i in ("%Adresse%") do set Strasse=%%i  
[...]

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.

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
Member: bastla
bastla May 23, 2010 at 22:58:38 (UTC)
Goto Top
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:
set Adresse=%*   // Erfolgt im Format Name;Strasse;PLZ;Ort

FOR /F "tokens=1 delims=;" %%i in ("%Adresse%") do set "Name=%%i"  
:: "&" behalten 
set "Name=%Name:&=^&"  
:: oder Ersetzung durch "und" 
:: 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
Member: Pfnuesel
Pfnuesel May 24, 2010 at 02:15:58 (UTC)
Goto Top
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 face-smile.
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
Member: bastla
bastla May 24, 2010 at 17:04:22 (UTC)
Goto Top
Hallo Pfnuesl!

Freut mich, dass wir helfen konnten ... face-smile

... und danke für die freundlichen Worte. face-smile

Grüße
bastla