willimoeglich
Goto Top

Per Batch, 1.Lösung, alle Zeilenumbrüche aus einer TXT-Datei entfernen oder alternativ geziehlte Textblöcke aus einer TXT-Datei in eine zweite kopieren

Hallo, habe schon viele tolle Anregungen in diesem Forum gefunden, und hoffe ein Batch-Spezi findet sich und kann mein Problem lösen.

Ausgangsproblem ist, aus einer Text-Datei definierte Abschnitte in separate Text-Dateien zu kopieren. Die Ausgangsdatei hat folgendes Aussehen:

\\Berlin\Hauptstr8\Hotel_zum_Löwen
Hans.Meier keine Telefon
Werner.Meier kein Telefon
\\Berlin\Bahnhofstr11\Hotel An der Bahn
Ute.Wagner handy
\\Bonn\Uferstr888\Hotel zum Sonderzeichen$
Bernd.Richter isdn-telefon

In einer Steuerdatei habe ich alle Hotelnamen, welche per FOR-schleife ausgelesen werden. Für die jeweiligen Anschriften sollen nun in separaten TXT-Dateien, die Bewohnernamen
mit den Telefonangaben aus der Ausgangsdatei kopiert werden.
Mein erster Gedanke war, das mit FINDSTR und RegEx suche zu machen, aber das geht leider nur Zeilenweise und dazu müsste die ganze Ausgangsdatei in einer Zeile vorliegen.
Denn die \\ und der Hotelname sind immer vorhanden. Zwischen zwei mal vorkommenden \\ als zeilenanfang, hätte ich den Block den ich dann noch von den unwichtigen
Inhalten, wie Ort\Straße und Hotelname befreien könnte.
Falls es die Lösung vereinfacht, so kann ich auch vor jeder Anschriftenzeile eine Leerzeile einfügen.

Also erste Frage, wie bekomme ich alle Zeilenumbrüche aus der Ausgangsdatei haraus?

Wenn jemand eine andere Lösung, zum gezielten rauskopieren der Namenszeilen hat währe das auch nicht schlecht und als Alternative willkommen.

In den Zieldateien sollte dann folgendes stehen:
1.Datei soll heißen: Hotel_zum_Löwen.txt und beinhalten:
Hans.Meier keine Telefon
Werner.Meier kein Telefon
2.Datei soll heißen: Hotel an der Bahn.txt und beinhalten:
Ute.Wagner handy

usw.

Content-Key: 134145

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

Printed on: April 19, 2024 at 07:04 o'clock

Mitglied: 77559
77559 Jan 22, 2010 at 17:39:23 (UTC)
Goto Top
Hallo Willi,

deine Aufgabenstellung ist zwar nicht ganz eindeutig aber versuch es mal hiermit:

@Echo off&Setlocal
set Ausgangsdatei=.\Hotels.txt
if defined Hotel set "Hotel="  
For /f "delims=" %%A in (%Ausgangsdatei%) do Call :check "%%~A"  
Pause
Goto :eof
:Check
Set Line=%~1
if "%Line:~0,2%" EQU "\\" set "Hotel=%Line:~2%"&goto :NewHotel  
if defined Hotel Echo/%~11>>"%Hotel%.txt"  
goto :Eof
:NewHotel
If "%Hotel%" NEQ "%Hotel:*\=%" Set "Hotel=%Hotel:*\=%"&Goto :NewHotel  
Echo Neues Hotel=%Hotel%
:: hier noch mögliche Sonderzeichen aus Dateinamen entfernen/maskieren
:: z.Bsp. Doppelpunkt gegen Unterstrich
Set "Hotel=%Hotel::=_%"  
Goto :eof

Nur Teilweise getestet.

Gruß
LotPings
Member: willimoeglich
willimoeglich Jan 23, 2010 at 10:38:25 (UTC)
Goto Top
Hallo LotPings,
zunächst vielen Dank, für die schnelle Antwort/Lösung, sieht erst mal vielversprechend aus, muss nun sehen ob es sich an meine Situation anpassen lässt.
Hatte übersehen, dass nicht alle Hotelnamen mit dem String "Hotel" beginnen. Hotels beginnen schließlich nicht alle mit "Hotel...". Aber das macht nichts.
Falls ich es nicht hinkriege melde ich mich noch mal. Trotzdem ist die Lösung sehr elegant, wie ich finde. Die Befehlserweiterung und If define war mir nicht eingefallen.
Ich berichte dann später wie das Ergebnis aussieht.
Gruß Willi
Mitglied: 77559
77559 Jan 23, 2010 at 13:36:27 (UTC)
Goto Top
Hallo Willi,
der String "Hotel" wird auch gar nicht gesucht.
Bei Zeilen welche mit "\\" beginnen wird der Abschnitt hinter dem letzten "\"Als Hotelname verwendet und in der Variablen "Hotel" gespeichert und solange als Dateiname verwendet bis er durch einen neuen Inhalt ersetzt wird.

Gruß
LotPings
Member: TsukiSan
TsukiSan Jan 23, 2010 at 14:34:48 (UTC)
Goto Top
also ganz eindeutig ist mir deine Frage nicht aber, wenn wir mal gaaanz langsam herangehen moechtest
du deine Ausgangsdatei "splitten". Weil Zeilenumbrueche sind ehr "vbCrLf".
Aber das alles in VBS zum Beispiel!
Also, wenn du nur "unterteilen" moechtest, dann google mal nach der SPLIT-Funktion in VBS oder so.
Ich meine, dass dich das ehr deinem Ziel naeher bringt.
Beispiel ind VBS fuer SPLIT and JOIN
Dim b()
Dim Delim

T = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"  
WScript.Echo "OriginalText: " & T  

Delim = "," 'ganzen String nach Kommas durchsuchen und bei jedem Komma splitten  
a = Split(T, Delim)

ReDim b(UBound(a))    'Alle "Einzelstücke" in ein Array (ohne Kommas!) einlesen   
For i = 0 To UBound(a) 
    b(i) = a(i)        
Next

Delim = "." 'Punkt zwischen die einzelnen Arrays einfügen und Ausgabe in GROSSBUCHSTABEN  
    c = UCase(Join(b, Delim))
WScript.Echo "Mit Punkt und gross: " & c  

Delim = ";" 'Semikolon zwischen die einzelnen Arrays einfügen und Ausgabe in kleinbuchstaben  
    c = LCase(Join(b, Delim))
Wscript.Echo "Mit Semikolon und klein: " & c  

msgbox ""  

Gruss
Tsuki
Member: willimoeglich
willimoeglich Jan 23, 2010 at 17:13:22 (UTC)
Goto Top
Hallo LotPings,
ja, die Antwort war etwas voreilig von mir. Habe nur ganz flüchtig drüber gesehen, sollte man ebend nicht machen.

Funktioniert übrigens prima, habe das ganze als CALL in mein vorbereitendes Script eingebaut. Brauchte bloß noch in Zeile 10 die "11" zur "1" machen
(war wohl ein Tipfehler) und schon war alles perfekt.
Ich habe es nun doch NICHT in eine For-schleife gepackt, sondern lösche die nicht benötigten "Hotel"-Dateien am ende einfach.
Also noch mal vielen Dank !

gruß Willi
Member: willimoeglich
willimoeglich Jan 23, 2010 at 17:17:19 (UTC)
Goto Top
Hallo Tsuki,
vielen dank für die Antwort, die Lösung ist auch nicht schlecht, nur lag mein Schwerpunkt darauf das ganze mit den Batch-Bordmittel zu lösen und nicht mit VBS.

Und das hat LotPings bestens umgesetzt.

Trotzdem vielen Dank !!!
Schon toll so ein Erfahrungsaustausch, mit soviel hilfbereiten Programmierern.

Gruß Willi