paradoxon
Goto Top

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 ??

Content-Key: 61503

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

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

Member: Biber
Biber Jun 15, 2007 at 22:12:53 (UTC)
Goto Top
Moin pArAdOxOn,

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
Member: bastla
bastla Jun 15, 2007 at 22:22:47 (UTC)
Goto Top
Hallo pArAdOxOn!

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
Member: pArAdOxOn
pArAdOxOn Jun 15, 2007 at 22:23:11 (UTC)
Goto Top
ich brauch halt die nummern ausgegeben in dem format hier T="nummer"
Member: Biber
Biber Jun 15, 2007 at 22:35:34 (UTC)
Goto Top
@bastla
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
Member: bastla
bastla Jun 15, 2007 at 22:50:56 (UTC)
Goto Top
@Biber

... 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
Member: pArAdOxOn
pArAdOxOn Jun 20, 2007 at 23:44:15 (UTC)
Goto Top
öhm das ganze funktioniert schon fast einwandfrei, ich hab blos noch ein kleines problem und zwar wird text der mit in der Zeile steht mit gefiltert, das ganze schaut dann so aus :

T="1132001 Bla Bla"
T="1132002 D1 M6"
T="1132003 "
T="1132004"
T="1132006 Bla "
T="1132008"
T="1132012"
T="1132014"
T="1132015"
T="1132016"
T="1132017"
T="1132018"
T="1132019"
T="1132021"
T="1132022"
T="1132020"

das hier war der gefilterte text :

T1132001 Bla Bla
T1132002 D1 M6
T1132003
T1132004
dsfsdf T1132005
T1132006 Bla
wefrwrf T1132007
T1132008
n5 T="1132009"
n1 T1132010
n2 T1132011
bla bla bla
bla bla bla
T1132012
n4 T1132013
bla bla bla
T1132014
T1132015
bla bla bla
T1132016
T1132017
T1132018
T1132019
T="1132020"
T1132021
T1132022
T1132023

ich hab mich schon dran versucht bin aber nicht weiter gekommen, bin am verzweifeln so sollte es im Optimalfall aussehen :

T="1132001"
T="1132002"
T="1132003 "
T="1132004"
T="1132006"
T="1132008"
T="1132012"
T="1132014"
T="1132015"
T="1132016"
T="1132017"
T="1132018"
T="1132019"
T="1132021"
T="1132022"
T="1132020"

und das sind die batchdateien:
Step1.bat
findstr /x /i /r "\<T11.*" 1.txt >> ausgabe.txt

findstr /x /i /r "\<T=.*" 1.txt >> ausgabe.txt


Step2.bat
@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

da wird bestimmt noch was zu machen sein
Member: bastla
bastla Jun 21, 2007 at 05:51:17 (UTC)
Goto Top
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:
for /f "delims= " %%i in (ausgabe.txt) do set "Zeile=%%i" & call :ProcessLine  
Die Veränderung zur vorigen Version besteht in der Leerstelle nach "delims=".

Grüße
bastla
Member: bastla
bastla Jun 21, 2007 at 08:23:17 (UTC)
Goto Top
... oder versuch es gleich mit dem folgenden VBScript:
'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
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:
cscript //nologo "C:\Scripts\Filtern.vbs" "D:\Ausgangsdatei.txt" 
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