Mit Batch-Datei alle Sonderzeichen in einer Textdatei entfernen
Hallo zusammen,
ich habe versucht mit Hilfe einer Batch Datei einen String aus einer mehrzeiligen Textdatei auszulesen und diesen dann wieder in eine andere Textdatei zu speichern.
Hierfür habe ich folgende Code gebastelt:
FOR /F "tokens=*" %%i in ('findstr /n /v "asdf" C:\temp.txt^|Findstr "07"') do Set ln=%%i
echo %ln% >>C:\daten.txt
Wenn die Zeile ausgelesen ist, soll diese nach dem String "07" durchsucht werden und anschließend die 6 Zeichen davor in eine Textdatei speichern. Das hätte ich bestimmt auch noch hinbekommen, leider komme ich aber nicht soweit, da es Probleme gibt mit dem lesen der Textdatei.
Hier ein Auszug aus der Textdatei:
€%
T | † ì } 8 ÒA ðÒA† ì L ÿÿÿÿÿÿÿÿ\ 1 4 . 0 9 . 0 7 # # # # # #
%
€%
T „ h
ì e 8 ÒA ðÒAhì L ÿÿÿÿÿÿÿÿ` f r e i " + " $
%
€%
T ˆ ò
ì
8 ÒA ðÒAò
ì
Ich habe jetzt die Frage an euch ob es vielleicht einen Befehl gibt, dass aus dieser Textdatei alle Sonderzeichen entfernen kann.
Vielleicht hilft die Info weiter, dass es in Excel mittels VB-Skript möglich ist.
Wenn ich die Datei in Excel öffne und ein VB-Skript erstelle in dem die Ascii Zeichen zwischen 46 und 127 gelöscht werden, dann funktioniert das, dann sind alle Sonderzeichen entfernt.
Ich will das ganze aber mit einer Batch-Datei machen.
Über einen Tipp wie ich das schaffen kann, wäre ich sehr dankbar.
Grüße,
Markus
ich habe versucht mit Hilfe einer Batch Datei einen String aus einer mehrzeiligen Textdatei auszulesen und diesen dann wieder in eine andere Textdatei zu speichern.
Hierfür habe ich folgende Code gebastelt:
FOR /F "tokens=*" %%i in ('findstr /n /v "asdf" C:\temp.txt^|Findstr "07"') do Set ln=%%i
echo %ln% >>C:\daten.txt
Wenn die Zeile ausgelesen ist, soll diese nach dem String "07" durchsucht werden und anschließend die 6 Zeichen davor in eine Textdatei speichern. Das hätte ich bestimmt auch noch hinbekommen, leider komme ich aber nicht soweit, da es Probleme gibt mit dem lesen der Textdatei.
Hier ein Auszug aus der Textdatei:
€%
T | † ì } 8 ÒA ðÒA† ì L ÿÿÿÿÿÿÿÿ\ 1 4 . 0 9 . 0 7 # # # # # #
%
€%
T „ h
ì e 8 ÒA ðÒAhì L ÿÿÿÿÿÿÿÿ` f r e i " + " $
%
€%
T ˆ ò
ì
8 ÒA ðÒAò
ì
Ich habe jetzt die Frage an euch ob es vielleicht einen Befehl gibt, dass aus dieser Textdatei alle Sonderzeichen entfernen kann.
Vielleicht hilft die Info weiter, dass es in Excel mittels VB-Skript möglich ist.
Wenn ich die Datei in Excel öffne und ein VB-Skript erstelle in dem die Ascii Zeichen zwischen 46 und 127 gelöscht werden, dann funktioniert das, dann sind alle Sonderzeichen entfernt.
Ich will das ganze aber mit einer Batch-Datei machen.
Über einen Tipp wie ich das schaffen kann, wäre ich sehr dankbar.
Grüße,
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 72425
Url: https://administrator.de/forum/mit-batch-datei-alle-sonderzeichen-in-einer-textdatei-entfernen-72425.html
Ausgedruckt am: 26.04.2025 um 04:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo dm-markus!
Wenn Du Dir sicher sein kannst, dass die einzige Kombination mit ".07" Dein gesuchtes Datum darstellt, könntest Du folgenden Batch (mit temporärem VBScript) verwenden:
Die Untersuchung der Datei erfolgt (analog zu Deinem Beispiel oben) zeilenweise.
Eine Verbesserung der Laufzeit wäre noch zu erzielen, indem das Script nach Ausgabe des ersten passenden Datumsstrings beendet wird. Dazu wäre ersatzweise folgende Zeile zu verwenden:
Grüße
bastla
[Edit] Hart codiertes Kriterium ".07" durch Variable ersetzt. [/Edit]
Wenn Du Dir sicher sein kannst, dass die einzige Kombination mit ".07" Dein gesuchtes Datum darstellt, könntest Du folgenden Batch (mit temporärem VBScript) verwenden:
@echo off & setlocal
set "Src=C:\temp.txt"
set "Dst=C:\daten.txt"
set Chk=".07"
set "GD=%temp%\GetDate.vbs"
echo T=Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("%Src%",1).ReadAll,vbCrLF)>"%GD%"
echo For Each L In T:D="":For i=1 To Len(L):C=Mid(L,i,1):If C="." Or (C^>="0" And C^<="9") Then D=D^&C>>"%GD%"
echo Next:If InStr(D,%Chk%) Then WScript.Echo Mid(D,InStr(D,%Chk%)-5,8)>>"%GD%"
echo Next>>"%GD%"
for /f %%i in ('cscript //nologo "%GD%"') do set Dat=%%i
if defined Dat (echo %Dat% >>"%Dst%") else echo Kein Datum gefunden!
del "%GD%"
Die Untersuchung der Datei erfolgt (analog zu Deinem Beispiel oben) zeilenweise.
Eine Verbesserung der Laufzeit wäre noch zu erzielen, indem das Script nach Ausgabe des ersten passenden Datumsstrings beendet wird. Dazu wäre ersatzweise folgende Zeile zu verwenden:
echo Next:If InStr(D,%Chk%) Then WScript.Echo Mid(D,InStr(D,%Chk%)-5,8):WScript.Quit>>"%GD%"
Grüße
bastla
[Edit] Hart codiertes Kriterium ".07" durch Variable ersetzt. [/Edit]
Hallo dm-markus!
Eine etwas
lesbarere Version des Scripts sieht so aus:
Es wird die gesamte Datei in ein Array "arrText" (aufgeteilt nach Zeilen) eingelesen und dann jede dieser Zeilen zeichenweise durchsucht, wobei nur "." und Ziffern in das (Zwischen-)Ergebnis aufgenommen werden.
Nach Zeilenende wird im Ergebnis nach ".07" gesucht. Ist dieser Teilstring enthalten, dann wird ab der Position "5 Zeichen vor dem Auftreten des Suchstrings" beginnend ein String von 8 Zeichen gebildet und ausgegeben. Da ich mich an Deinem geposteten Beispiel orientieren musste, wäre das Ergebnis zunächst "814.09.07" - vom "." vor "07" 5 Zeichen nach vorne befindet sich "1", und von dort insgesamt 8 Zeichen liefern dann "14.09.07" - zumindest mit den dargestellten Testdaten erhalte ich also das gewünschte Ergebnis (nochmals unter Verwendung meines oben geposteten Batchcodes verifiziert).
Falls es Dir hilft, eine Variante, die zeilenweise nur die brauchbaren Zeichen ausgibt:
Das damit erzielte Ergebnis für Dein Beispiel wäre:
Grüße
bastla
Eine etwas
Set fso = CreateObject("Scripting.FileSystemObject")
Set objTxtFile = fso.OpenTextFile("C:\temp.txt", 1)
strGesamtText = objTxtFile.ReadAll
arrText = Split(strGesamtText, vbCrLF)
For Each strLine In arrText
strDatum = ""
For i = 1 To Len(strLine)
chrC = Mid(strLine, i, 1)
If chrC = "." Or (chrC >= "0" And chrC <= "9") Then strDatum = strDatum & chrC
Next
If InStr(strDatum, ".07") Then WScript.Echo Mid(strDatum, InStr(strDatum,".07")-5, 8)
Next
Nach Zeilenende wird im Ergebnis nach ".07" gesucht. Ist dieser Teilstring enthalten, dann wird ab der Position "5 Zeichen vor dem Auftreten des Suchstrings" beginnend ein String von 8 Zeichen gebildet und ausgegeben. Da ich mich an Deinem geposteten Beispiel orientieren musste, wäre das Ergebnis zunächst "814.09.07" - vom "." vor "07" 5 Zeichen nach vorne befindet sich "1", und von dort insgesamt 8 Zeichen liefern dann "14.09.07" - zumindest mit den dargestellten Testdaten erhalte ich also das gewünschte Ergebnis (nochmals unter Verwendung meines oben geposteten Batchcodes verifiziert).
Falls es Dir hilft, eine Variante, die zeilenweise nur die brauchbaren Zeichen ausgibt:
@echo off & setlocal
set "Src=C:\temp.txt"
set "Dst=C:\daten.txt"
if exist "%Dst%" del "%Dst%"
set "GD=%temp%\GetDate.vbs"
echo T=Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("%Src%",1).ReadAll,vbCrLF)>"%GD%"
echo For Each L In T:D="":For i=1 To Len(L):C=Mid(L,i,1):If C="." Or (C^>="0" And C^<="9") Then D=D^&C>>"%GD%"
echo Next:WScript.Echo D:Next>>"%GD%"
for /f %%i in ('cscript //nologo "%GD%"') do echo %%i>>"%Dst%"
del "%GD%"
814.09.07
8
8
Grüße
bastla
Hallo dm-markus!
Das Problem mit den Chr(0) zwischen den einzelnen Stellen des Datums kann ich nicht nachvollziehen. Diese fallen ohnehin weg (da ja nur "." und Ziffern in den String "D" aufgenommen werden), sodass ich auch bei einer entsprechend Änderung der Testdaten immer noch das gesuchte Datum erhalte ...
Grüße
bastla
Das Problem mit den Chr(0) zwischen den einzelnen Stellen des Datums kann ich nicht nachvollziehen. Diese fallen ohnehin weg (da ja nur "." und Ziffern in den String "D" aufgenommen werden), sodass ich auch bei einer entsprechend Änderung der Testdaten immer noch das gesuchte Datum erhalte ...
Grüße
bastla
... zum Thema "Datum bis zu viermal" könnte die Vorgangsweise so aussehen:
Die vom Script (hoffentlich) zurückgelieferten Datumswerte zunächst zerlegen und im Format "JJ.MM.TT" wieder zusammensetzen und so in eine temporäre Textdatei schreiben, diese danach sortiert ausgeben und den Wert der letzten Zeile verwenden, also etwa:
Bei jedem Schleifendurchlauf wird %MaxWert% überschrieben, so dass am Ende der Wert aus der letzten (sortierten) Zeile darin enthalten ist.
Grüße
bastla
Die vom Script (hoffentlich) zurückgelieferten Datumswerte zunächst zerlegen und im Format "JJ.MM.TT" wieder zusammensetzen und so in eine temporäre Textdatei schreiben, diese danach sortiert ausgeben und den Wert der letzten Zeile verwenden, also etwa:
if exist %temp%\ToSort.txt del %temp%\ToSort.txt
for /f "tokens=1-3 delims=." %%i in ('cscript //nologo "%GD%"') do echo %%k.%%j.%%i >>%temp%\ToSort.txt
for /f %%i in ('sort %temp%\ToSort.txt') do set MaxWert=%%i
echo %MaxWert% >>%Dst%
Grüße
bastla
Hallo dm-markus!
Unter Berücksichtigung der Tatsache, dass ".07" ja auch als Monatsangabe zu interpretieren wäre und um das Auftreten mehrerer Datumswerte zu erfassen, eine neue Version:
Grüße
bastla
Unter Berücksichtigung der Tatsache, dass ".07" ja auch als Monatsangabe zu interpretieren wäre und um das Auftreten mehrerer Datumswerte zu erfassen, eine neue Version:
@echo off & setlocal
set "Src=Z:\temp.txt"
set "Dst=Z:\daten.txt"
set Chk=".07"
set "Uns=%temp%\unsortiert.txt"
set "Sor=%temp%\zusortieren.txt"
if exist "%Sor%" del "%Sor%"
set "GD=%temp%\GetDate.vbs"
echo T=CreateObject("Scripting.FileSystemObject").OpenTextFile("%Src%",1).ReadAll>"%GD%"
echo L=Len(T):For i=1 To L:C=Mid(T,i,1):If C="." Or (C^>="0" And C^<="9") Then D=D^&C>>"%GD%"
echo Next:L=Len(D):P=InStr(D,%Chk%):Do While P^>0 And P^<L:If (P+3)^<=L Then If Mid(D,P+3,1)^<^>"." Then E=E^&Mid(D,P-5,8)^&vbCrLF>>"%GD%"
echo P=InStr(P+1,D,".07"):Loop:WScript.Echo E>>"%GD%"
cscript //nologo "%GD%">"%Uns%"
for /f "usebackq tokens=1-3 delims=." %%i in ("%Uns%") do echo %%k.%%j.%%i >>"%Sor%"
for /f %%i in ('sort "%Sor%"') do set MaxWert=%%i
(echo %MaxWert%)>"%Dst%"
del "%GD%"
del "%Uns%"
del "%Sor%"
Grüße
bastla