For-Schleife Daten zusammenführen
Hallo,
ich bin ganz neu hier im Forum und relativ neu in der Batchprogrammierung.
Aber ich will heute mal ohne Umschweife mit dem Problem beginnen:
Ich habe in einer Textdatei eine große Menge Informationen, aus dieser Datei suche ich mir mit Hilfe von FINDSTR die benötigte Angabe (zB das Land) und speicher Sie in einer anderen Datei mit Postleitzahlen. Das funktioniert alles relativ gut.
Jetzt würde ich es aber gerne schaffen, dass mir FINDSTR die gefunden Ergebnisse in einer bestimmten Reihenfolge in die Datei schreibt, also anstatt so:
so:
Das wollte ich mit einer For Schleife schaffen die immer 2 Zeilen überspringt das erste gefundene Ergebniss schreibt, dann wieder 2 überspringt und das zweite Ergebniss schreibt usw...
Außerdem schreibt er mir vor das gefundene Ergebniss das Suchwort, falls es möglich ist würde ich das auch gerne entfernen, dass ist allerdings eher nebensächlich und nicht so wichtig.
Leider bin ich schon bei beiden Problemen im Ansatz gescheitert
Ich hoffe ihr könnt mir helfen.
Falls ihr mehr Informationen / deutlichere Beispiele benötigt fragt einfach nach.
Mit freundlichen Grüßen
Bastelking
ich bin ganz neu hier im Forum und relativ neu in der Batchprogrammierung.
Aber ich will heute mal ohne Umschweife mit dem Problem beginnen:
Ich habe in einer Textdatei eine große Menge Informationen, aus dieser Datei suche ich mir mit Hilfe von FINDSTR die benötigte Angabe (zB das Land) und speicher Sie in einer anderen Datei mit Postleitzahlen. Das funktioniert alles relativ gut.
Jetzt würde ich es aber gerne schaffen, dass mir FINDSTR die gefunden Ergebnisse in einer bestimmten Reihenfolge in die Datei schreibt, also anstatt so:
12345
23456
45656
LAND: Germany - Hamburg
LAND: Germany - Berlin
LAND: Paris - Frankreich
12345
Germany - Hamburg
23456
Germany - Berlin
45656
Paris - Frankreich
Das wollte ich mit einer For Schleife schaffen die immer 2 Zeilen überspringt das erste gefundene Ergebniss schreibt, dann wieder 2 überspringt und das zweite Ergebniss schreibt usw...
Außerdem schreibt er mir vor das gefundene Ergebniss das Suchwort, falls es möglich ist würde ich das auch gerne entfernen, dass ist allerdings eher nebensächlich und nicht so wichtig.
Leider bin ich schon bei beiden Problemen im Ansatz gescheitert
Ich hoffe ihr könnt mir helfen.
Falls ihr mehr Informationen / deutlichere Beispiele benötigt fragt einfach nach.
Mit freundlichen Grüßen
Bastelking
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 94365
Url: https://administrator.de/forum/for-schleife-daten-zusammenfuehren-94365.html
Ausgedruckt am: 29.04.2025 um 13:04 Uhr
12 Kommentare
Neuester Kommentar

Servus,
nicht schön, aber funktionierend wäre folgendes:
Nicht nach dem "suchen" - was du willst - sondern das, was du nicht willst - aussortieren.
Die Daten sollten in c:\Datei.txt sein und werden nach und nach in eine test_tmp.txt geschrieben und die wiederum schreibt (mit einem ungewünschten Begriff weniger) in die c:\test.txt.
Und ganz am ende wird dann das Ergebnis im Editor ausgegeben.
Die Zeile könntest du (zu Testzwecken) auch so
(je nachdem welche Datei in der Zeile vorher "ausgegeben wurde (mit > am Ende steht).
(edit) ....als zusätzliche Zeile unter jede "findstr Zeile" schreiben /(edit)
Gruß
PS: In deiner Quelle fehlt die PLZ
nicht schön, aber funktionierend wäre folgendes:
Nicht nach dem "suchen" - was du willst - sondern das, was du nicht willst - aussortieren.
Die Daten sollten in c:\Datei.txt sein und werden nach und nach in eine test_tmp.txt geschrieben und die wiederum schreibt (mit einem ungewünschten Begriff weniger) in die c:\test.txt.
Und ganz am ende wird dann das Ergebnis im Editor ausgegeben.
Die Zeile könntest du (zu Testzwecken) auch so
start wait notepad c:\test_tmp.txt
bzw.start wait notepad c:\test.txt
(je nachdem welche Datei in der Zeile vorher "ausgegeben wurde (mit > am Ende steht).
(edit) ....als zusätzliche Zeile unter jede "findstr Zeile" schreiben /(edit)
findstr /v "Name" c:\datei.txt > c:\test_tmp.txt
findstr /v "Address" c:\test_tmp.txt > c:\test.txt
findstr /v "Email" c:\test.txt > c:\test_tmp
findstr /v "Phone" c:\test_tmp >c:\test.txt
findstr /v "Fax" c:\test.txt > c:\test_tmp.txt
findstr /v "Country" c:\test_tmp.txt c:\test.txt
notepad c:\test.txt
Gruß
PS: In deiner Quelle fehlt die PLZ
Moin Bastelding,
diese Mimik mit der Zwischendatei ist IMHO eher hinderlich.
Sinnvoller wäre ein Vorgehen mit 2 Dateien:
Dann lässt es sich mit einem Einzeiler abfackeln
Demo am CMD-Prompt.
[Die xx-Nummern habe ich jetzt direkt in eine FOR-Anweisung gepackt.
Wenn die in einer Extra-datei stehen wird es einfacher.]
Grüße
Biber
[Edit nach dem 2. T-Mo-Kommentar]
Uupps, dass diese Zahlen Postleitzahlen sein sollen hatte ich überlesen.
Dann reicht in der Tat ein einfaches "Findstr" ohne FORlefanz. [/Edit]
@bastla Doppeltes /n hab ich entfernt. Danke.
Meine ingesamt.txt sah natürlich nur noch so aus:
Country: Germany - Hamburg
Country: Germany - Berlin
Country: Germany - Dresden
diese Mimik mit der Zwischendatei ist IMHO eher hinderlich.
Sinnvoller wäre ein Vorgehen mit 2 Dateien:
- eine Quelldatei wie oben (+PLZ natürlich)
- eine weitere Datei mit den neu ausgedachten Kunden- oder whatever-Nummern.
Dann lässt es sich mit einem Einzeiler abfackeln
Demo am CMD-Prompt.
(Set /a "x=0">nul ) & @for %i in (01067 17219 01069) do @(set /a "x+=1">nul) & @for /f "delims=: tokens=1,*" %j in ('Findstr /n /i "country" ingesamt.txt^|find "!x!:"') do @(echo %i) & @echo %k
01067
Country: Germany - Hamburg
17219
Country: Germany - Berlin
01069
Country: Germany - Dresden
Wenn die in einer Extra-datei stehen wird es einfacher.]
Grüße
Biber
[Edit nach dem 2. T-Mo-Kommentar]
Uupps, dass diese Zahlen Postleitzahlen sein sollen hatte ich überlesen.
Dann reicht in der Tat ein einfaches "Findstr" ohne FORlefanz. [/Edit]
@bastla Doppeltes /n hab ich entfernt. Danke.
Meine ingesamt.txt sah natürlich nur noch so aus:
Country: Germany - Hamburg
Country: Germany - Berlin
Country: Germany - Dresden

*kopfkratz*
@Biber:
isse noch viel Einfacha und geht dem auch alse Einezeiler (allerdings schon wieder nix in eine Sleiffe gesrieben ich abbe )
Gruß
hab heute meinen Italienischen Tag --der Urlaub naht..
@Biber:
isse noch viel Einfacha und geht dem auch alse Einezeiler (allerdings schon wieder nix in eine Sleiffe gesrieben ich abbe )
findstr "PLZ Country" c:\datei.txt > c:\datei_ohne_alles_mit_plz_Country.txt
Gruß
hab heute meinen Italienischen Tag --der Urlaub naht..
@timobeil
Soferne ich das richtig verstanden habe, hat Bastelking allerdings genau das Problem,
dass er keine PLZ in der Datei hat ...
@Biber: Eigentlich wollte ich auch mit "findstr /n" arbeiten, aber leider liefert das ja bei Anwendung auf die (bei Dir) "ingesamt.txt" keine fortlaufenden Zeilennummern (dazu müsste es etwa so aussehen:
wie sich das auf die Performance (vor allem im Vergleich zum auch nicht gerade flotten "more" auswirkt, wäre zu testen) ...
... außerdem bist Du bei "findstr" etwas verrutscht ("/n" anstelle von "/b")
@Bastelking
Wenn ich das Ganze einigermaßen richtig durchschaut habe, etwa so:
Grüße
bastla
[Edit] "findstr"-Variante ergänzt [/Edit]
Soferne ich das richtig verstanden habe, hat Bastelking allerdings genau das Problem,
dass er keine PLZ in der Datei hat ...
@Biber: Eigentlich wollte ich auch mit "findstr /n" arbeiten, aber leider liefert das ja bei Anwendung auf die (bei Dir) "ingesamt.txt" keine fortlaufenden Zeilennummern (dazu müsste es etwa so aussehen:
findstr /b /i "Country:" Adressen.txt|findstr /n .|findstr /b "%Zeile%:"
... außerdem bist Du bei "findstr" etwas verrutscht ("/n" anstelle von "/b")
@Bastelking
Wenn ich das Ganze einigermaßen richtig durchschaut habe, etwa so:
@echo off & setlocal
set "Adressen=D:\Adressen.txt"
set "PLZ=D:\PLZ.txt"
set "Ergebnis=D:\PLZOrte.txt"
set "Orte=%temp%\Orte.txt"
if exist "%Ergebnis%" del "%Ergebnis%"
if exist "%Orte%" del "%Orte%"
for /f "tokens=1* delims=: " %%i in ('findstr "Country:" "%Adressen%"') do >>"%Orte%" echo %%j
set /a Zeile=0
for /f "usebackq" %%i in ("%PLZ%") do call :ProcessEntry %%i
del "%Orte%"
goto :eof
:ProcessEntry
>>"%Ergebnis%" echo %1
set Ort=
for /f "delims=" %%a in ('more +%Zeile% "%Orte%"') do if not defined Ort set "Ort=%%a"
>>"%Ergebnis%" echo %Ort%
set /a Zeile+=1
goto :eof
bastla
[Edit] "findstr"-Variante ergänzt [/Edit]

Moin,

yupp
siehe Findstr /?
Daher bitte genauso - wie gestern schon geschrieben (die dateinamen darfst /solltest du natürlich ändern/anpassen)
Gruß
Fast Perfekt, wieso bin ich nicht auf sowas einfaches gekommen? :P
...weil "wir" es gewohnt sind - einfache Probleme kompliziert lösen zu wollen Allerdings müsste ich noch wissen wie ich mit 2 Suchbegriffen und dem genauen Wortlaut suchen kann?
Findstr /C:"PLZ" "Country" > ende.txt
Funktioniert leider nicht.
Findstr /C:"PLZ" "Country" > ende.txt
Funktioniert leider nicht.
yupp
siehe Findstr /?
Leerzeichen weisen auf mehrere getrennte Zeichenfolgen hin, außer es wurde /c
als Option angegeben.
Zum Beispiel sucht 'FINDSTR "Windows NT" BR.TXT' nach "Windows" oder "NT" in der Datei BR.TXT.
'FINDSTR /C:"Windows NT" BR.TXT' hingegen sucht nach "Windows NT" in der Datei BR.TXT.
als Option angegeben.
Zum Beispiel sucht 'FINDSTR "Windows NT" BR.TXT' nach "Windows" oder "NT" in der Datei BR.TXT.
'FINDSTR /C:"Windows NT" BR.TXT' hingegen sucht nach "Windows NT" in der Datei BR.TXT.
Daher bitte genauso - wie gestern schon geschrieben (die dateinamen darfst /solltest du natürlich ändern/anpassen)
findstr "PLZ Country" c:\datei.txt > c:\datei_ohne_alles_mit_plz_Country.txt
Gruß
Hallo Bastelking!
Soferne es zu jedem "Country"-Eintrag auch einen "Aktuelle PLZ"-Eintrag gibt, könntest Du mit
direkt von der Kommandozeile eine PLZ-Liste erzeugen und dann nochmals einen Blick auf meinen oben geposteten Vorschlag werfen ...
Grüße
bastla
Soferne es zu jedem "Country"-Eintrag auch einen "Aktuelle PLZ"-Eintrag gibt, könntest Du mit
for /f "tokens=2* delims=: " %i in ('findstr /c:"Aktuelle PLZ:" "D:\Adressen.txt"') do >>"D:\PLZ.txt" echo %j
Grüße
bastla

Servus,
naja - wer außer dir kann das wissen....
in deinem Beispiel stand ja keine einzige Zeile mit PLZ
von daher bitte mal einen kompletten Datensatz mitschicken und solange mal
ausprobieren...
> Parameter /b sucht am Zeilenanfang - daher werden die Zeilen die mit "alte" oder Zukünftige oder "aktuelle" trotz nachfolgendem "PLZ" nicht "gefunden".
Gruß
naja - wer außer dir kann das wissen....
in deinem Beispiel stand ja keine einzige Zeile mit PLZ
von daher bitte mal einen kompletten Datensatz mitschicken und solange mal
findstr /B "PLZ Country" c:\datei.txt > c:\datei_ohne_alles_mit_plz_Country.txt
> Parameter /b sucht am Zeilenanfang - daher werden die Zeilen die mit "alte" oder Zukünftige oder "aktuelle" trotz nachfolgendem "PLZ" nicht "gefunden".
Gruß