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:
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 143197
Url: https://administrator.de/contentid/143197
Ausgedruckt am: 23.11.2024 um 01:11 Uhr
14 Kommentare
Neuester Kommentar
Hallo Pfnuesel!
Vielleicht so (als Demo):
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"):
[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
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%#
@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%#
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
Auch von mir ein Willkommen.
Wenn z.Bsp. die Hausnummer unmittelbar auf die Straße folgt wie bei:
greift bastlas Ansatz nicht.
Die Nummer kannst du aus Strasse gewinnen indem du den Inhalt von Street aus Strasse löscht.
Der Pseudo call bewirkt, das zuerst der Inhalt von Street eingetragen und erst dann die Ersetzung ausgeführt wird.
Gruß
LotPings
Noch eine Frage
Gibt es für meine obige Formel eine sauberere Lösung als delims=1234567890?
So schlecht ist der Ansatz nicht.Gibt es für meine obige Formel eine sauberere Lösung als delims=1234567890?
Wenn z.Bsp. die Hausnummer unmittelbar auf die Straße folgt wie bei:
Kaiserstr.25
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%]
Gruß
LotPings
@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
Ohne ein geeignetes Kriterium (ich habe oben einmal ein Leerzeichen vor der Nummer angenommen) wird das in keiner Sprache leicht sein ...
Grüße
bastla
Zitat von @bastla:
Ohne ein geeignetes Kriterium (ich habe oben einmal ein Leerzeichen vor der Nummer angenommen) wird das in keiner Sprache leicht sein ...
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
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
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):
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
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):
@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%#
Grüße
bastla
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:
Der Interpreter wird durch das Voranstellen von "^" angewiesen, das folgende Zeichen als gewöhnlichen Text zu behandeln - das sähe dann so aus:
Die Überprüfung sollte übrigens auch ohne Ersetzung mit
klappen (gefunden wird das "&" ja auch zwischen den Anführungszeichen) ...
Grüße
bastla
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"
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%"
echo "%Name%"|findstr "&">nul || goto :Negativ
Grüße
bastla