eine Textdatei durchsuchen und Suchergebnisse verändert in eine weitere Textdatei ausgeben
Soh folgendes , ich muss aus einer Datei eine bestimmte Zeichenfolge filtern, und diese abgeändert in eine 2. Datei schreiben. Ich bin schon soweit , das ich ich das mit dem filtern im Griff hab. Wurde von mir so realisiert :
findstr /i /c "\<T11.*" 1.txt > ausgabe.txt
findstr /i /c "\<T=.*" 1.txt >> ausgabe.txt
so weit so gut, nun kommt der schwierige Teil und zwar können die ergebnisse entweder so T="1132001" oder so T1132001 in der zu durchsuchenden Datei enthalten sein . Das ganze muss noch vereinheitlicht werden, das alles eben so aussieht T="1132001" .
k.A. was ich mir überlegt hatte, war das man die suchergebnisse in Variablen zerlegt und dann wieder dementsprechend ausgibt falls dies möglich ist ??
findstr /i /c "\<T11.*" 1.txt > ausgabe.txt
findstr /i /c "\<T=.*" 1.txt >> ausgabe.txt
so weit so gut, nun kommt der schwierige Teil und zwar können die ergebnisse entweder so T="1132001" oder so T1132001 in der zu durchsuchenden Datei enthalten sein . Das ganze muss noch vereinheitlicht werden, das alles eben so aussieht T="1132001" .
k.A. was ich mir überlegt hatte, war das man die suchergebnisse in Variablen zerlegt und dann wieder dementsprechend ausgibt falls dies möglich ist ??
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 61503
Url: https://administrator.de/forum/eine-textdatei-durchsuchen-und-suchergebnisse-veraendert-in-eine-weitere-textdatei-ausgeben-61503.html
Ausgedruckt am: 23.04.2025 um 05:04 Uhr
8 Kommentare
Neuester Kommentar
Moin pArAdOxOn,
willkommen im Forum.
Na, dann solltest Du uns bitte noch verraten,
Wenn in der Origanaldatei Zeilen stehen mit
- entweder dem String "T11nnnn"
- oder eventuell dem String "T="11nnn"
Dann erwischt Du alle Zeilen IMHO eher so:
In der Ausgabedatei kannst Du dann alle Zeilen jeweils in eine Variable kopieren und dann innerhalt dieser Zeile ersetzen.
Gruß
Biber
willkommen im Forum.
Na, dann solltest Du uns bitte noch verraten,
- was denn nun noch in den Zeilen der ausgabe.txt steht/stehen kann
- und was denn nun erhalten bleiben soll in der "endgültigen" Ergebnisdatei
Wenn in der Origanaldatei Zeilen stehen mit
- entweder dem String "T11nnnn"
- oder eventuell dem String "T="11nnn"
Dann erwischt Du alle Zeilen IMHO eher so:
findstr "T11 T=\"11" 1.txt
In der Ausgabedatei kannst Du dann alle Zeilen jeweils in eine Variable kopieren und dann innerhalt dieser Zeile ersetzen.
....
For /f "delims=" %%i in (ausgabe.txt) do call :processLine "%%i"
goto eof:
:Processline
Set "thisline=%~1"
...(hier fehlt mir die Info, was von den alten zeilen erhalten bleiben soll)
Gruß
Biber
Hallo pArAdOxOn!
Nach Deinem Beispiel oben müsste es etwa so gehen:
@Biber
Nach den interessanten Erlebnissen neulich mit ";" und Anführungszeichen beim Übergeben von Texten an Unterprogramme versuche ich es mal mit der Variablenzuweisung gleich in der "for"-Zeile - was hältst Du davon?
Grüße
bastla
Nach Deinem Beispiel oben müsste es etwa so gehen:
@echo off & setlocal
del Ergebnis.txt 2>nul
for /f "delims=" %%i in (ausgabe.txt) do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
echo %Zeile%|findstr "=">>Ergebnis.txt && goto :eof
echo %Zeile:~0,1%="%Zeile:~1%">>Ergebnis.txt
@Biber
Nach den interessanten Erlebnissen neulich mit ";" und Anführungszeichen beim Übergeben von Texten an Unterprogramme versuche ich es mal mit der Variablenzuweisung gleich in der "for"-Zeile - was hältst Du davon?
Grüße
bastla
@bastla
Aber nach diesem exotischen Fall neulich... hmm...
...könnte ich mir ja versuchen anzugewöhnen.
Schlechter lesbar finde ich es trotzdem, weil diese FOR ...IN DO...-Zeilen bei mir manchmal ohnehin schon so lang sind, dass ich die Feinheiten nach dem DO nicht immer im Auge behalten kann.
Grüße
Biber
Variablenzuweisung gleich in der "for"-Zeile - was hältst Du davon?
Eigentlich halte ich es für schlechter lesbar so.Aber nach diesem exotischen Fall neulich... hmm...
...könnte ich mir ja versuchen anzugewöhnen.
Schlechter lesbar finde ich es trotzdem, weil diese FOR ...IN DO...-Zeilen bei mir manchmal ohnehin schon so lang sind, dass ich die Feinheiten nach dem DO nicht immer im Auge behalten kann.
Grüße
Biber
@Biber
Grüße
bastla
... manchmal ohnehin schon so lang sind ...
In der Hinsicht tue ich mir vergleichsweise leicht (vermutlich, weil mit Old-School-Basic "aufgewachsen" und daher ein umstandsloses "goto" / "gosub" gewöhnt) - bei meinen Schleifen gibt's meist nach dem "do" nicht viel mehr als ein "call" ...Grüße
bastla
Hallo pArAdOxOn!
Falls das, was Du "gefilterten" Text nennst, der Inhalt von "Ausgabe.txt" sein sollte, dann ergibt sich ein wesentlicher Unterschied zu Deiner Beschreibung von oben: Die "T"-Werte stehen nicht immer am Anfang - ist das so? Auf keinen Fall dürften aber Zeilen wie "bla bla bla" enthalten sein ...
Um die Inhalte des ersten Beispiels auf zB T="1132001" zu beschränken, müsste es genügen, die folgende Zeile ersatzweise in die Batchdatei zu schreiben:
Die Veränderung zur vorigen Version besteht in der Leerstelle nach "delims=".
Grüße
bastla
Falls das, was Du "gefilterten" Text nennst, der Inhalt von "Ausgabe.txt" sein sollte, dann ergibt sich ein wesentlicher Unterschied zu Deiner Beschreibung von oben: Die "T"-Werte stehen nicht immer am Anfang - ist das so? Auf keinen Fall dürften aber Zeilen wie "bla bla bla" enthalten sein ...
Um die Inhalte des ersten Beispiels auf zB T="1132001" zu beschränken, müsste es genügen, die folgende Zeile ersatzweise in die Batchdatei zu schreiben:
for /f "delims= " %%i in (ausgabe.txt) do set "Zeile=%%i" & call :ProcessLine
Grüße
bastla
... oder versuch es gleich mit dem folgenden VBScript:
Du kannst entweder die zu filternde Datei per Drag And Drop auf die Script-Datei ziehen, oder, wenn das Script zB in "C:\Scripts\Filtern.vbs" gespeichert wurde, dieses von der Kommandozeile oder aus einem Batch wie folgt starten:
Als Ergebnis erhältst Du eine "D:\Ausgangsdatei-bearbeitet.txt". Der Zusatz "-bearbeitet" wird in der 2. Zeile des Scripts festgelegt und kann natürlich auch geändert werden.
Arbeitsweise: Das Script sucht in jeder Zeile der übergebenen Datei nach dem ersten "T" und übernimmt dieses und alle weiteren Zeichen bis zum nächsten Leerzeichen oder bis zum Ende der Zeile (was eben früher kommt). Danach wird dieser "TWert" (wie gewünscht formatiert) in die Ausgabedatei geschrieben.
Grüße
bastla
'Filtern.vbs
Const Suffix = "-bearbeitet"
If WScript.Arguments.Count = 0 Then
WScript.Echo "Keine Datei angegeben!"
WScript.Quit
End If
Set fso = CreateObject("Scripting.FileSystemObject")
EinDatei = WScript.Arguments(0)
If Not fso.FileExists(EinDatei) Then
WScript.Echo "Angegebene Datei '" & EinDatei & "' nicht gefunden!"
WScript.Quit
End If
AusDatei = Left(EinDatei, InStrRev(EinDatei, ".") - 1) & Suffix & _
Mid(EinDatei, InStrRev(EinDatei, "."))
Zeilen = Split(fso.OpenTextFile(EinDatei, 1).ReadAll, vbCrLF)
Set Aus = fso.OpenTextFile(AusDatei, 2, True)
For i = 0 To UBound(Zeilen)
Teile = Split(Zeilen(i), " ")
TWert = ""
For j = 0 To UBound(Teile)
If Left(Teile(j), 1) = "T" Then
TWert = Teile(j)
Exit For
End If
Next
If Left(TWert, 3) = "T=""" Then
If Right(TWert, 1) = """" Then
Aus.WriteLine TWert
Else
Aus.WriteLine TWert & """"
End If
ElseIf Left(TWert, 2) = "T=" Then
Aus.WriteLine "T=""" & Mid(TWert, 3) & """"
ElseIf Left(TWert, 1) = "T" Then
Aus.WriteLine "T=""" & Mid(TWert, 2) & """"
End If
Next
Aus.Close
cscript //nologo "C:\Scripts\Filtern.vbs" "D:\Ausgangsdatei.txt"
Arbeitsweise: Das Script sucht in jeder Zeile der übergebenen Datei nach dem ersten "T" und übernimmt dieses und alle weiteren Zeichen bis zum nächsten Leerzeichen oder bis zum Ende der Zeile (was eben früher kommt). Danach wird dieser "TWert" (wie gewünscht formatiert) in die Ausgabedatei geschrieben.
Grüße
bastla