Frage ist gelöstMehrere .txt mit Batch auslesen und verändern ?
06.02.2012
09:28:11 Uhr401 Aufrufe
16 Antworten
09:28:11 Uhr
16 Antworten
Noch nicht bewertet
Hallo zusammen,
ich möchte gerne eine Batch schreiben, habe aber feststellen müssen das meine Kenntnisse für diesen umfang nichtmehr ausreichen oder es mit einer Batch nicht evtl. garnicht geht...
ich möchte gerne eine Batch schreiben, habe aber feststellen müssen das meine Kenntnisse für diesen umfang nichtmehr ausreichen oder es mit einer Batch nicht evtl. garnicht geht...
Es geht darum dass ich in einen Ordner beliebige aber immer gleiche Art von Dateien kopiere für eine spätere Auswertung.
Diese Dateien haben einen nummerischen Namen Bsp. 101219246720.txt in dieser Datei gibt es ca. 27 Zeilen mit Alphanummerischen Werten,
wobei die ersten 3 die läge der Zeile angeben und nächsten 4 Ziffern immer angeben welcher wert dann kommt.
Ich möchte nun gerne mit dieser Batch bei allen Zeilen die ersten 3 Ziffern Löschen, die werden nicht benötigt.
Und dann alle Zeilen bis auf ca. 13 die dann mit den bestimmten Ziffer beginnen löschen.
Zudem gibt es in dem Ordner ca. 50 dieser txt. Immer andere nummerischer Name bei denen das passieren soll.
Ist das überhaupt mit einer Batch zu realisieren ?
Meine Idee war diese Werte mit Find zu suchen in eine neue Datei zu speichern, die alte zu löschen und diese neue dann in die alte umzubenennen aber ich scheiter da kläglich dran.
könnt ihr mir helfen?
Diese Dateien haben einen nummerischen Namen Bsp. 101219246720.txt in dieser Datei gibt es ca. 27 Zeilen mit Alphanummerischen Werten,
wobei die ersten 3 die läge der Zeile angeben und nächsten 4 Ziffern immer angeben welcher wert dann kommt.
Ich möchte nun gerne mit dieser Batch bei allen Zeilen die ersten 3 Ziffern Löschen, die werden nicht benötigt.
Und dann alle Zeilen bis auf ca. 13 die dann mit den bestimmten Ziffer beginnen löschen.
Zudem gibt es in dem Ordner ca. 50 dieser txt. Immer andere nummerischer Name bei denen das passieren soll.
Ist das überhaupt mit einer Batch zu realisieren ?
Meine Idee war diese Werte mit Find zu suchen in eine neue Datei zu speichern, die alte zu löschen und diese neue dann in die alte umzubenennen aber ich scheiter da kläglich dran.
könnt ihr mir helfen?
pieh-ejdsch schreibt am 06.02.2012 um 10:17:40 Uhr
moin DaMoRph,
also Ungetestet würde dies etwa so sein:
[edit] popD nachgezogen [/edit]
[edit2 usebackq nachgezogen ... und in die Richtige Zeile gesteckt/edit]
EDIT funktioniert doch nicht, da delayed Ausdrücke in mit Klammern zusammengefassten Befehlszeilen als nichtdelayed Ausdrücke im Übergebenen Befehl nicht automatisch delayed ausgegeben werden.
/EDIT
Gruß Phil
also Ungetestet würde dies etwa so sein:
01.
@echo off &setlocal 02.
set "Quelle=D:\Testordner" 03.
set "Ziel=D:\Anderer Ordner" 04.
05.
set "DateiFilter=[0-9]*.txt" 06.
07.
set "ZeileLöschen=1234" 08.
09.
pushD "%quelle%" 10.
for /f "delims=" %%i in ('dir /b *.txt ^|findstr /r /b "%DateiFilter%"') do call :Files "%%i" 11.
popD 12.
goto :eof 13.
:Files 14.
( 15.
for /f "usebackq delims=" %%i in (%1) do (@set "Line=%%i" 16.
@setlocal enabledelayedexpansion 17.
@echo !Line:~3! 18.
@endlocal 19.
) 20.
) | findstr /v /b "%ZeileLöschen%" > "%Ziel%\%~nx1"[edit2 usebackq nachgezogen ... und in die Richtige Zeile gesteckt/edit]
EDIT funktioniert doch nicht, da delayed Ausdrücke in mit Klammern zusammengefassten Befehlszeilen als nichtdelayed Ausdrücke im Übergebenen Befehl nicht automatisch delayed ausgegeben werden.
/EDIT
Gruß Phil
pieh-ejdsch schreibt am 06.02.2012 um 12:37:58 Uhr
hmmm, ich versuch es mal
also in
Zeile 2 und 3 bestimmst Du den Quellordner und den Zielordner.
In Zeile 5 bestimmt Du den Filter fürs Filtern der TXT Dateien (nur Ziffern vor der Dateiendung).
In Zeile 7 bestimmst Du den Filter fürs entfernen der Zeilen, weche ab dem 4. Zeichen diese Ziffern übereinstimmend enthalten.
In Zeile 9 wird in das Quellverzeichnis gewechselt.
In Zeile 10 werden alle TXT laut DateiFilter nacheinander dem Unterprogramm :Files als ersten Parameter Übergeben.
Nun SchauMaMal was das Unterprogramm macht:
In Zeile 14 sorgt die öffnende Klammer und die Schliessende Klammer von Zeile 20 für eine Gesamtausgabe der For Schleife.
In Zeile 15 bis 19 stelle ich fest die Option usebackq fehlt, um den Dateiinhalt abzuarbeiten
wird jede Zeile der übergebenen TXT ohne die ersten 3 Zeichen ausgegeben.
In Zeile 15 bis 18 sorgt das @ fürs ausblenden der Befehle, damit dem Findstr nur die reinen AusgabeZeilen übergeben werden.
In Zeile 20 werden die Zeilen nicht angezeigt, welche mit den Inhalt von ZeileLöschen beginnen und in eine TXT im Zeilordner eingefügt.
In Zeile 11 und 12 wird erst aus dem Quellverzeichnis wieder zurückgesprungen und anschliesend der Batch Beendet.
Gruß Phil
also in
Zeile 2 und 3 bestimmst Du den Quellordner und den Zielordner.
In Zeile 5 bestimmt Du den Filter fürs Filtern der TXT Dateien (nur Ziffern vor der Dateiendung).
In Zeile 7 bestimmst Du den Filter fürs entfernen der Zeilen, weche ab dem 4. Zeichen diese Ziffern übereinstimmend enthalten.
In Zeile 9 wird in das Quellverzeichnis gewechselt.
In Zeile 10 werden alle TXT laut DateiFilter nacheinander dem Unterprogramm :Files als ersten Parameter Übergeben.
Nun SchauMaMal was das Unterprogramm macht:
In Zeile 14 sorgt die öffnende Klammer und die Schliessende Klammer von Zeile 20 für eine Gesamtausgabe der For Schleife.
In Zeile 15 bis 19 stelle ich fest die Option usebackq fehlt, um den Dateiinhalt abzuarbeiten
wird jede Zeile der übergebenen TXT ohne die ersten 3 Zeichen ausgegeben.
In Zeile 15 bis 18 sorgt das @ fürs ausblenden der Befehle, damit dem Findstr nur die reinen AusgabeZeilen übergeben werden.
In Zeile 20 werden die Zeilen nicht angezeigt, welche mit den Inhalt von ZeileLöschen beginnen und in eine TXT im Zeilordner eingefügt.
In Zeile 11 und 12 wird erst aus dem Quellverzeichnis wieder zurückgesprungen und anschliesend der Batch Beendet.
Gruß Phil
DaMoRph schreibt am 06.02.2012 um 15:04:35 Uhr
Vilen dank schon mal für die Mühe,
ich habe das jetzt ausprobiert, aber es will nicht.
Die Batch erzeugt keine txt in dem anderen Ordner.
Und ich denke ich brauche den filter für den Namen der txt nicht denn die Batch kann bzw. soll alle Dateien die in dem Ordner sind bearbeiten.
Frage: der Parameter der den Wert für die zu löschende Zeile enthält, wie kann ich da mehrere werte hinzufügen? Denn es sin ja mehrere Zeilen die zu löschen sind.
mfg S.Meister
ich habe das jetzt ausprobiert, aber es will nicht.
Die Batch erzeugt keine txt in dem anderen Ordner.
Und ich denke ich brauche den filter für den Namen der txt nicht denn die Batch kann bzw. soll alle Dateien die in dem Ordner sind bearbeiten.
Frage: der Parameter der den Wert für die zu löschende Zeile enthält, wie kann ich da mehrere werte hinzufügen? Denn es sin ja mehrere Zeilen die zu löschen sind.
mfg S.Meister
bastla schreibt am 06.02.2012 um 16:10:43 Uhr
Hallo DaMoRph und willkommen im Forum!
Wenn Du keinen Dateifilter benötigst, könntest Du es mit der folgende Variante versuchen:
Hier werden alle Zeilen entfernt, welche ab der 4. Stelle (deswegen jeweils die 3 Punkte davor) die Werte 1234 oder 0000 enthalten ...
Grüße
bastla
Wenn Du keinen Dateifilter benötigst, könntest Du es mit der folgende Variante versuchen:
01.
@echo off & setlocal 02.
set "Quelle=D:\Testordner" 03.
set "Ziel=D:\Anderer Ordner" 04.
05.
set "ZeileLöschen=...1234 ...0000" 06.
07.
md "%Ziel%" 2>nul 08.
pushD "%quelle%" 09.
for /f "delims=" %%i in ('dir /b *.txt') do call :Files "%%i" 10.
popD 11.
goto :eof 12.
:Files 13.
( 14.
for /f "delims=" %%i in ('findstr /v /b "%ZeileLöschen%" %1') do ( 15.
set "Line=%%i" 16.
setlocal enabledelayedexpansion 17.
echo !Line:~3! 18.
endlocal 19.
) 20.
)>"%Ziel%\%~nx1"Grüße
bastla
pieh-ejdsch schreibt am 06.02.2012 um 19:11:25 Uhr
moin bastla,
Deine funktioniert sogar. Ich habe nicht getestet.
Ich dachte es geht - aber falsch gedacht. Abgesehen davon das das usebackq in der falschen For war und kein Zielverzeichnis erstellt wird wenn es fehlt.
Es wird nur der Text !Line:~3! in die TXT geschrieben.
Das kann ich mir nur so erklären, dass der Befehl in der Klammer immer ohne delayedexpansion mit den folgenden Verknüpft wird.
Umleitungen klappen aber immer --- Komisch.
In Jebs Die Geheimnisse des Batch Zeilen Interpreters ist es nicht aufgeführt oder daraus abzuleiten.
Gruß Phil
Deine funktioniert sogar. Ich habe nicht getestet.
Ich dachte es geht - aber falsch gedacht. Abgesehen davon das das usebackq in der falschen For war und kein Zielverzeichnis erstellt wird wenn es fehlt.
Es wird nur der Text !Line:~3! in die TXT geschrieben.
Das kann ich mir nur so erklären, dass der Befehl in der Klammer immer ohne delayedexpansion mit den folgenden Verknüpft wird.
01.
set "line=abcde" 02.
setlocal enabledelayedexpansion 03.
(echo !line!)|findstr /n "^" 04.
endlocalIn Jebs Die Geheimnisse des Batch Zeilen Interpreters ist es nicht aufgeführt oder daraus abzuleiten.
Gruß Phil
rubberman schreibt am 06.02.2012 um 20:57:14 Uhr
Hallo Phil,
auch dafür hatte jeb eine Erklärung, allerdings englisch ...
Why does delayed expansion fail when inside a piped block of code?
Stark vereinfacht: Beide Seiten der Pipe werden in ihrem eigenen Kommandozeilenkontext ausgeführt. Die verzögerte Variablenerweiterung wird dabei nicht vererbt. Ich hoffe, der verlinkte Thread trägt zum Verständnis bei.
Grüße
rubberman
auch dafür hatte jeb eine Erklärung, allerdings englisch ...
Why does delayed expansion fail when inside a piped block of code?
Stark vereinfacht: Beide Seiten der Pipe werden in ihrem eigenen Kommandozeilenkontext ausgeführt. Die verzögerte Variablenerweiterung wird dabei nicht vererbt. Ich hoffe, der verlinkte Thread trägt zum Verständnis bei.
Grüße
rubberman
pieh-ejdsch schreibt am 07.02.2012 um 00:53:18 Uhr
moin rubberman,
Wie lange läufst Du denn schon?
Ja ist einleutend mit dem Pipen aber
da kamma ja Improvisieren...
auch
Wie lange läufst Du denn schon?
Ja ist einleutend mit dem Pipen aber
da kamma ja Improvisieren...
01.
setlocal 02.
set "line=abcdexxx" 03.
set "line2=12345xxx" 04.
set "linea=xyz123abc" 05.
06.
setlocal enabledelayedexpansion 07.
( 08.
echo !line! 09.
echo !line2! 10.
echo !linea! 11.
)|findstr /n "^" 12.
13.
rem wenn das so nicht funktioniert dann bleibt ja als Variation fast nur das uebrig: 14.
15.
>Line.cmd (@echo @setlocal enabledelayedexpansion&@echo @echo(^^!Line%%~1%%~2%%~3%%~4%%~5%%^^!) 16.
17.
( 18.
line :~3 19.
line : "~3,-3" 20.
line 2 ":*5=" 21.
line a : ~ 5 22.
line a 23.
)|sort|findstr /n "^" 24.
25.
call line 2 ":*3=" 26.
27.
pauseauch
ganz erschrocken ...
Gruß Phil
rubberman schreibt am 07.02.2012 um 01:06:02 Uhr
Hallo Phil.
Och, so ca. seit 40 Jahren (meistens mit nächtlichen Unterbrechungen)
Für kürzere Sequenzen kannst du auch direkt die cmd mit den entsprechenden Optionen aufrufen.
Mehrere Zeilen eben per & verknüpfen, fertig.
Natürlich ist das Ganze grottenlangsam, für jede Zeile einmal cmd und findstr als externe Tools zu laden. Allerdings habe ich jetzt auch nicht DIE Lösung parat. Ich denke bastlas Code ist da ziemlich nah am Optimum, da findstr auf die Datei, nicht aber auf jede einzelne Zeile angewendet wird.
Grüße
rubberman
Och, so ca. seit 40 Jahren (meistens mit nächtlichen Unterbrechungen)
Für kürzere Sequenzen kannst du auch direkt die cmd mit den entsprechenden Optionen aufrufen.
01.
set "line=abcde" 02.
(cmd /q /v:on /c "echo(!line!")|findstr /n "^"Natürlich ist das Ganze grottenlangsam, für jede Zeile einmal cmd und findstr als externe Tools zu laden. Allerdings habe ich jetzt auch nicht DIE Lösung parat. Ich denke bastlas Code ist da ziemlich nah am Optimum, da findstr auf die Datei, nicht aber auf jede einzelne Zeile angewendet wird.
Grüße
rubberman
pieh-ejdsch schreibt am 07.02.2012 um 09:29:32 Uhr
moin rubberman,
na da lauf ich ja erst ca 34 Jahre herum
meinte ja Dein Bildchen
Wieder einen Grund mehr VBS anzuwenden bzw weiter zu lernen.
Gruß Phil
na da lauf ich ja erst ca 34 Jahre herum
Natürlich ist das Ganze grottenlangsam ... bastlas Code ist da ziemlich nah am Optimum.
sehe ich auch so - daher habe ich ja ganz oben den Roten Merker eingügt (und den nicht so funtionierenden Code so stehen gelassen,und weil es hier vollkommen unproduktiv ist).Wieder einen Grund mehr VBS anzuwenden bzw weiter zu lernen.
Gruß Phil
bastla schreibt am 07.02.2012 um 10:33:25 Uhr
Hallo PH und rubberman!
:
Grüße
bastla
Wieder einen Grund mehr VBS anzuwenden
Ich hab das mal als Auftrag verstanden 01.
Quelle = "D:\Testordner" 02.
Ziel = "D:\Anderer Ordner" 03.
04.
Muster = "#1234#0000#8765#" 'weitere Suchbegriffe zum Entfernen von Zeilen hier - mit # begrenzt - hinzufügen 05.
Entfernen = 3 'Zeichenanzahl, die am Zeilenanfang entfernt werden soll 06.
Testen = 4 'Zeichenanzahl, die am Anfang der neuen Zeile geprüft werden soll 07.
08.
Set fso = CreateObject("Scripting.FileSystemObject") 09.
If Not fso.FolderExists(Ziel) Then fso.CreateFolder(Ziel) 10.
11.
For Each File In fso.GetFolder(Quelle).Files 12.
TextAlt = Split(File.OpenAsTextStream.ReadAll, vbCrLf) 13.
TextNeu = "" 14.
For Each Line In TextAlt 15.
If InStr(Muster, "#" & Mid(Line, Entfernen + 1, Testen) & "#") = 0 Then 16.
TextNeu = TextNeu & vbCrLf & Mid(Line, Entfernen + 1) 17.
End If 18.
Next 19.
20.
'Die ersten beiden Zeichen in "TextNeu" stellen eine Zeilenschaltung dar und 21.
' werden deshalb bei der Ausgabe übersprungen. 22.
fso.CreateTextFile(Ziel & "\" & File.Name).Write Mid(TextNeu, 3) 23.
Nextbastla
DaMoRph schreibt am 07.02.2012 um 15:05:45 Uhr
Hi zusammen,
ich bin eben erst wieder dazu gekommen es zu testen, ...und esl läuft super :D
Ich danke euch viel mals dafür.
Ich werde administrator.de gleich mal meinen Kollegen weiterempfehlen!
Aber eine Frage oder bitte habe ich noch, im Momment löschen wir das was Find findet.
Ist es auch umgekehrt möglich das wir alles aus der Datei löschen, bis auf die zeilen mit den bestimmten ziffern an stelle 4-7 ?
mfg S.Meister
ich bin eben erst wieder dazu gekommen es zu testen, ...und esl läuft super :D
Ich danke euch viel mals dafür.
Ich werde administrator.de gleich mal meinen Kollegen weiterempfehlen!
Aber eine Frage oder bitte habe ich noch, im Momment löschen wir das was Find findet.
Ist es auch umgekehrt möglich das wir alles aus der Datei löschen, bis auf die zeilen mit den bestimmten ziffern an stelle 4-7 ?
mfg S.Meister
pieh-ejdsch schreibt am 07.02.2012 um 15:54:03 Uhr
moin DaMoRph,
natürlich - die Option /Vertausche Gefundenes mit Nicht gefundenem Ergebnis Weglassen.
die CMD-Hilfe help findstr gibt Dir immer Antworten.
Gruß Phil
natürlich - die Option /Vertausche Gefundenes mit Nicht gefundenem Ergebnis Weglassen.
die CMD-Hilfe help findstr gibt Dir immer Antworten.
Gruß Phil













