bastelking
Goto Top

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:
12345

23456

45656

LAND:   Germany - Hamburg
LAND:   Germany - Berlin
LAND:   Paris - Frankreich
so:
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 face-sad
Ich hoffe ihr könnt mir helfen.
Falls ihr mehr Informationen / deutlichere Beispiele benötigt fragt einfach nach.

Mit freundlichen Grüßen
Bastelking

Content-Key: 94365

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

Printed on: April 24, 2024 at 05:04 o'clock

Member: bastla
bastla Aug 13, 2008 at 16:00:13 (UTC)
Goto Top
Hallo Bastelking und willkommen im Forum!

Ein kurzer Auszug aus den jeweiligen Quelldateien würde das Ganze etwas leichter nachvollziehbar machen ...

Grüße
bastla
Member: Bastelking
Bastelking Aug 13, 2008 at 16:17:12 (UTC)
Goto Top
Hallo bastla,
hier ein Auszug aus der Datei die als erstes durchsucht wird:
Country:      Germany - Hamburg
Firmen Name: 
Owner Name:   
Contact Name:  
Address:      xxxxstraße, hausnummer
Email:        blub@blub.de 
Phone:        1234567890
Fax:  12345678901
   
Country:      Germany - Berlin
Firmen Name: 
Owner Name:   
Contact Name:  
Address:      xxxxstraße, hausnummer
Email:        blub@blub.de 
Phone:        1234567890
Fax:  12345678901
Aus dieser Datei suche ich wie gesagt mit FINDSTR nach "Country", und speicher die Ergebnisse in dieser Datei:
01067

17219

01069
Danach sieht es dann so aus:
01067

17219

01069

Country: Germany - Hamburg
Country: Germany - Berlin
Country: Germany - Dresden

Die Daten sind alle aus Datenschutzgründen geändert / raus editiert, aber das sollte ja an dem Verständnis nichts ändern, oder?

Mit freundlichen Grüßen
Bastelking
Mitglied: 60730
60730 Aug 13, 2008 at 17:00:27 (UTC)
Goto Top
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
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 face-wink
Member: Biber
Biber Aug 13, 2008 at 17:15:33 (UTC)
Goto Top
Moin Bastelding,

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
[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
Mitglied: 60730
60730 Aug 13, 2008 at 17:29:23 (UTC)
Goto Top
*kopfkratz*

@Biber:
isse noch viel Einfacha und geht dem auch alse Einezeiler (allerdings schon wieder nix in eine Sleiffe gesrieben ich abbe ) face-wink

findstr "PLZ Country" c:\datei.txt > c:\datei_ohne_alles_mit_plz_Country.txt

Gruß
hab heute meinen Italienischen Tag --der Urlaub naht..
Member: bastla
bastla Aug 13, 2008 at 17:34:40 (UTC)
Goto Top
@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:
findstr /b /i "Country:" Adressen.txt|findstr /n .|findstr /b "%Zeile%:"  
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:
@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
Grüße
bastla

[Edit] "findstr"-Variante ergänzt [/Edit]
Member: Bastelking
Bastelking Aug 13, 2008 at 18:06:11 (UTC)
Goto Top
Hallo,
ich denke das Problem ist so gut wie gelöst ;).

Die Lösung die mir bisher am besten gefallen hat war die von TimoBeil, weil ich sie auch verstanden habe ;).
Allerdings würde ich sie gerne noch ein wenig verfeinern.
Ich habe in der Quell Datei, alle mögliche Angaben und will bis auf 2 (PLZ LAND) alle löschen. Bei TimoBeils Lösung wurden die in eine temporäre Datei ausgelagert, geht das nicht auch ohne? Also so grob:
findstr /L "Name" qulle.txt del  
.
.
. 

@Biber
Deine Lösung verstehe ich leider nicht ganz, aber ich gluabe du meinst etwas, was mein Problem perfekt löst.
Nur so weit ich die Zeile
for %i in (01067 17219 01069)
verstanden habe, müsste ich die ganzen PLZs kennen, was ich nicht tue.

nochmal @timobeil:
Fast Perfekt, wieso bin ich nicht auf sowas einfaches gekommen? :P
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.
Sobald das Problem gelöst ist sind wir hier auch fertig ;)

Schon mal jetzt ein riesiges Dankeschön an alle die sich hier beteiligt haben.

Mit freundlichen Grüßen
Bastelking
Mitglied: 60730
60730 Aug 14, 2008 at 10:02:40 (UTC)
Goto Top
Moin,

Fast Perfekt, wieso bin ich nicht auf sowas einfaches gekommen? :P
...weil "wir" es gewohnt sind - einfache Probleme kompliziert lösen zu wollen face-wink

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.

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.

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ß
Member: Bastelking
Bastelking Aug 14, 2008 at 13:26:27 (UTC)
Goto Top
Ja das hab ich gesehen, das löst mein Problem bloß nicht ganz. Ich habe in der Quelldatei nämlich auch Felder die "Alte PLZ" / "Zukünftige PLZ" / "Aktuelle PLZ" heißen, deswegen wollte ich mit /C: nach dem genauem Wortlaut suchen. Also "Aktuelle PLZ" und "Country" suchen und dann speichern.

Mit freundlichen Grüßen
Bastelking
Member: bastla
bastla Aug 14, 2008 at 13:34:47 (UTC)
Goto Top
Hallo Bastelking!

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  
direkt von der Kommandozeile eine PLZ-Liste erzeugen und dann nochmals einen Blick auf meinen oben geposteten Vorschlag werfen ...

Grüße
bastla
Mitglied: 60730
60730 Aug 14, 2008 at 13:38:38 (UTC)
Goto Top
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
 findstr /B "PLZ Country" c:\datei.txt > c:\datei_ohne_alles_mit_plz_Country.txt  
ausprobieren...
> Parameter /b sucht am Zeilenanfang - daher werden die Zeilen die mit "alte" oder Zukünftige oder "aktuelle" trotz nachfolgendem "PLZ" nicht "gefunden".

Gruß
Member: Bastelking
Bastelking Aug 14, 2008 at 13:48:02 (UTC)
Goto Top
PERFEKT!
Danke, es funktioniert perfekt. Danke Danke Danke! Ich kann mich garnicht genug bedanken.

Ich werde das Thema mal als abgehackt kennzeichnen.

Danke nochmal.

mfg
Bastelking