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

For-Schleife Daten zusammenführen

Frage Entwicklung Batch & Shell

Mitglied: Bastelking

Bastelking (Level 1) - Jetzt verbinden

13.08.2008, aktualisiert 14.08.2008, 3650 Aufrufe, 12 Kommentare

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:
01.
 
02.
12345 
03.
 
04.
23456 
05.
 
06.
45656 
07.
 
08.
LAND:   Germany - Hamburg 
09.
LAND:   Germany - Berlin 
10.
LAND:   Paris - Frankreich
so:
01.
12345 
02.
Germany - Hamburg 
03.
 
04.
23456 
05.
Germany - Berlin 
06.
 
07.
45656 
08.
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
Mitglied: bastla
13.08.2008 um 18:00 Uhr
Hallo Bastelking und willkommen im Forum!

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

Grüße
bastla
Bitte warten ..
Mitglied: Bastelking
13.08.2008 um 18:17 Uhr
Hallo bastla,
hier ein Auszug aus der Datei die als erstes durchsucht wird:
01.
Country:      Germany - Hamburg 
02.
Firmen Name:  
03.
Owner Name:    
04.
Contact Name:   
05.
Address:      xxxxstraße, hausnummer 
06.
Email:        blub@blub.de  
07.
Phone:        1234567890 
08.
Fax:  12345678901 
09.
    
10.
Country:      Germany - Berlin 
11.
Firmen Name:  
12.
Owner Name:    
13.
Contact Name:   
14.
Address:      xxxxstraße, hausnummer 
15.
Email:        blub@blub.de  
16.
Phone:        1234567890 
17.
Fax:  12345678901
Aus dieser Datei suche ich wie gesagt mit FINDSTR nach "Country", und speicher die Ergebnisse in dieser Datei:
01.
 
02.
01067 
03.
 
04.
17219 
05.
 
06.
01069 
07.
 
Danach sieht es dann so aus:
01.
 
02.
01067 
03.
 
04.
17219 
05.
 
06.
01069 
07.
 
08.
Country: Germany - Hamburg 
09.
Country: Germany - Berlin 
10.
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
Bitte warten ..
Mitglied: 60730
13.08.2008 um 19:00 Uhr
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)
01.
findstr /v "Name" c:\datei.txt > c:\test_tmp.txt 
02.
findstr /v "Address"  c:\test_tmp.txt > c:\test.txt 
03.
findstr /v "Email" c:\test.txt > c:\test_tmp 
04.
findstr /v "Phone" c:\test_tmp >c:\test.txt 
05.
findstr /v "Fax" c:\test.txt > c:\test_tmp.txt 
06.
findstr /v "Country" c:\test_tmp.txt c:\test.txt 
07.
notepad c:\test.txt
Gruß

PS: In deiner Quelle fehlt die PLZ
Bitte warten ..
Mitglied: Biber
13.08.2008 um 19:15 Uhr
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.
01.
(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 
02.
01067 
03.
Country: Germany - Hamburg 
04.
17219 
05.
Country: Germany - Berlin 
06.
01069 
07.
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
Bitte warten ..
Mitglied: 60730
13.08.2008 um 19:29 Uhr
*kopfkratz*

@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..
Bitte warten ..
Mitglied: bastla
13.08.2008 um 19:34 Uhr
@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:
01.
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:
01.
@echo off & setlocal 
02.
set "Adressen=D:\Adressen.txt" 
03.
set "PLZ=D:\PLZ.txt" 
04.
set "Ergebnis=D:\PLZOrte.txt" 
05.
set "Orte=%temp%\Orte.txt" 
06.
 
07.
if exist "%Ergebnis%" del "%Ergebnis%" 
08.
if exist "%Orte%" del "%Orte%" 
09.
for /f "tokens=1* delims=: " %%i in ('findstr "Country:" "%Adressen%"') do >>"%Orte%" echo %%j 
10.
 
11.
set /a Zeile=0 
12.
for /f "usebackq" %%i in ("%PLZ%") do call :ProcessEntry %%i 
13.
del "%Orte%" 
14.
goto :eof 
15.
 
16.
:ProcessEntry 
17.
>>"%Ergebnis%" echo %1 
18.
set Ort= 
19.
for /f "delims=" %%a in ('more +%Zeile% "%Orte%"') do if not defined Ort set "Ort=%%a" 
20.
>>"%Ergebnis%" echo %Ort% 
21.
set /a Zeile+=1 
22.
goto :eof
Grüße
bastla

[Edit] "findstr"-Variante ergänzt [/Edit]
Bitte warten ..
Mitglied: Bastelking
13.08.2008 um 20:06 Uhr
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:
01.
findstr /L "Name" qulle.txt del 
02.
03.
04.
. 
@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
01.
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?
01.
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
Bitte warten ..
Mitglied: 60730
14.08.2008 um 12:02 Uhr
Moin,

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.

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ß
Bitte warten ..
Mitglied: Bastelking
14.08.2008 um 15:26 Uhr
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
Bitte warten ..
Mitglied: bastla
14.08.2008 um 15:34 Uhr
Hallo Bastelking!

Soferne es zu jedem "Country"-Eintrag auch einen "Aktuelle PLZ"-Eintrag gibt, könntest Du mit
01.
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
Bitte warten ..
Mitglied: 60730
14.08.2008 um 15:38 Uhr
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
01.
 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ß
Bitte warten ..
Mitglied: Bastelking
14.08.2008 um 15:48 Uhr
PERFEKT!
Danke, es funktioniert perfekt. Danke Danke Danke! Ich kann mich garnicht genug bedanken.

Ich werde das Thema mal als abgehackt kennzeichnen.

Danke nochmal.

Mit freundlichen Grüßen
Bastelking
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...