knechtibus
Goto Top

Bedingt Zeilen aus .txt kopieren per Batch

Hallo miteinander,

würde gerne mittels Batch bedingt Zeilen aus einer link.txt Datei kopieren. Folgendermaßen sieht der Inhalt der .txt Datei aus:

Scenario_Online[0,0].Name=R001 <<S_BBB_LDN1-1
Scenario_Online[0,1].Name=R001 >>S_BBB_LDN1-1
Scenario_Online[0,12].Name=R007 <<S_BBG_LLG1-1
Scenario_Online[0,13].Name=R007 >>S_BBG_LLG1-1
Scenario_Online[0,14].Name=R008 <<V_LTT_LLG1-2
Scenario_Online[0,15].Name=R008 >>V_LTT_LLG1-2
Scenario_Online[0,14].Name=R010 <<UMUM 4004
Scenario_Online[0,15].Name=R010 >>UMUM 4004

Das bedingt kopieren in eine Datei dat.txt soll nun folgendermaßen aussehen. Es soll überprüft werden ob die Zeile mit einem "-1" oder "-2" abschließt. Wenn dies der Fall ist soll überprüft werden ob der jeweils andere Fall auch in der link.txt vorhanden ist. Wenn diese beiden Fälle, also "-1" und "-2" in der link.txt vorhanden sind(mittlerer Block des Beispielinhaltes), sollen diese Zeilen in die Datei dat.txt kopiert werden.
Sollte nur einer der beiden Fälle("-1" bzw. "-2") in der Datei vorhanden sein, soll nichts kopiert werden(erster Block des Beispielinhaltes). Ebenso soll verfahren werden wenn keine "-1" oder "-2" am Ende der Textzeile steht (letzter Block des Beispielinhaltes).

Das herausfiltern dieser obigen Zeilen aus einer größeren Textdatei mittels findstr ist mir bereits gelungen aber an dem benötigten bedingten kopieren hapert es bei mir leider noch.

Freu mich auf eure Antworten.

MfG knechtibus

Content-Key: 121541

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

Printed on: April 26, 2024 at 22:04 o'clock

Member: bastla
bastla Jul 29, 2009 at 09:34:48 (UTC)
Goto Top
Hallo knechtibus!

Was wäre denn in Deinem Beispiel oben der "jeweils andere Fall" bzw der "mittlere Block", und wie sollte das Ergebnis aussehen?

Grüße
bastla
Member: knechtibus
knechtibus Jul 29, 2009 at 09:50:15 (UTC)
Goto Top
Hallo bastla,

ja das ist vielleicht noch nicht ganz konkret wie ich mir das vorstelle. Es soll also geprüft werden ob die Zeile mit "-1" oder "-2" abschließt. Wenn dies der Fall ist soll geprüft werden ob es die selbe Zeile nocheinmal mit der jeweils anderen Zahl am Ende gibt. Wie z.B. hier:

Scenario_Online[0,12].Name=R007 <<S_BBG_LLG1-1
Scenario_Online[0,13].Name=R007 >>S_BBG_LLG1-1
Scenario_Online[0,14].Name=R008 <<S_BBG_LLG1-2
Scenario_Online[0,15].Name=R008 >>S_BBG_LLG1-2

Nur wenn diese Kombination auftritt, sollen die 4 Zeilen in die dat.txt kopiert werden. In allen anderen Fällen(keine -1 oder -2 am Ende oder die selbe Zeile nur mit -1 oder nur mit -2) soll nichts weiter geschehen. Hoffe mein Problem ist etwas klarer geworden.

MfG
knechtibus
Member: bastla
bastla Jul 29, 2009 at 09:56:12 (UTC)
Goto Top
Hallo knechtibus!

Das hieße, dass nur der Teil ab/nach ">>" bzw "<<" zu berücksichtigen wäre?

Grüße
bastla
Member: knechtibus
knechtibus Jul 29, 2009 at 09:59:19 (UTC)
Goto Top
Hallo bastla,

ja das könnte man so sagen. Das wäre eigentlich der relevante Teil der zu berücksichtigen wäre. Die >> bzw << wären jedoch auch wichtig.

MfG
knechtibus
Member: bastla
bastla Jul 29, 2009 at 10:05:26 (UTC)
Goto Top
Hallo knechtibus!

Dann könnte es (vorausgesetzt, es gibt nur ein einziges Leerzeichen vor dem entsprechenden Teil) etwa so gehen:
@echo off & setlocal
set "Ein=D:\link.txt"  
set "Aus=D:\dat.txt"  

if exist "%Aus%" del "%Aus%"  
for /f "delims=" %%i in ('findstr /e "\-1 \-2" "%Ein%"') do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
for /f "tokens=1*" %%i in ("%Zeile%") do set "Vergl=%%j"  
if "%Vergl:~-1,1%"=="1" (set "Vergl=%Vergl:~,-1%2") else (set "Vergl=%Vergl:~,-1%1")  
findstr /e /c:"%Vergl%" "%Ein%">nul || goto :eof  
set "Zeile=%Zeile:<=^<%"  
set "Zeile=%Zeile:>=^>%"  
>>"%Aus%" echo %Zeile%  
goto :eof
Grüße
bastla
Member: knechtibus
knechtibus Jul 29, 2009 at 10:24:53 (UTC)
Goto Top
Hallo bastla,

habe es gerade einmal mit einer verkürzten Version der link.txt versucht, in der nicht so viele Daten drinstehen. Leider geschieht beim ausführen der bat Datei nichts. Die Ausgabe Datei wird gelöscht, dann jedoch keine neue angelegt.
Mir ist übrigens eingefallen, dass beim Fehlen der "-1" bzw. "-2" am Ende der Zeile, diese Zeile auch in die dat.txt kopiert werden soll.
Vielleicht hast du ja noch ne Idee woran es liegen könnte. Sieht ja fast so aus als würde er erst gar nicht nach ProcessLine springen.

MfG
knechtibus
Member: bastla
bastla Jul 29, 2009 at 10:40:10 (UTC)
Goto Top
Hallo Knechtibus!

Da ich ja nur Deine Testdaten in dieser Version:
Scenario_Online[0,0].Name=R001 <<S_BBB_LDN1-1
Scenario_Online[0,1].Name=R001 >>S_BBB_LDN1-1
Scenario_Online[0,12].Name=R007 <<S_BBG_LLG1-1
Scenario_Online[0,13].Name=R007 >>S_BBG_LLG1-1
Scenario_Online[0,14].Name=R008 <<S_BBG_LLG1-2
Scenario_Online[0,15].Name=R008 >>S_BBG_LLG1-2
Scenario_Online[0,14].Name=R010 <<UMUM 4004
Scenario_Online[0,15].Name=R010 >>UMUM 4004
zur Verfügung habe, konnte ich auch nur damit testen - Ergebnis:
Scenario_Online[0,12].Name=R007 <<S_BBG_LLG1-1
Scenario_Online[0,13].Name=R007 >>S_BBG_LLG1-1
Scenario_Online[0,14].Name=R008 <<S_BBG_LLG1-2
Scenario_Online[0,15].Name=R008 >>S_BBG_LLG1-2
Bitte zu beachten, dass am Ende der Zeile kein Leerzeichen enthalten sein darf!

Für das Testen ist es sinnvoll, das "echo off" auf "echo on" zu ändern und den Batch direkt von der Kommandozeile zu starten - so werden alle Befehle vor der Ausführung angezeigt.
Die neue Anforderung, dass "beim Fehlen der "-1" bzw. "-2" am Ende der Zeile, diese Zeile auch in die dat.txt kopiert werden soll", ließe sich etwa so umsetzen:
@echo off & setlocal
set "Ein=D:\link.txt"  
set "Aus=D:\dat.txt"  

if exist "%Aus%" del "%Aus%"  
for /f "usebackq delims=" %%i in ("%Ein%") do set "Zeile=%%i" & call :ProcessLine  
goto :eof

:ProcessLine
for /f "tokens=1*" %%i in ("%Zeile%") do set "Vergl=%%j"  
if "%Vergl:~-1,1%"=="1" (  
    set "Vergl=%Vergl:~,-1%2"  
) else (
    if "%Vergl:~-1,1%"=="2" (  
        set "Vergl=%Vergl:~,-1%1"  
    ) else (
        goto :Write
    )
)
findstr /e /c:"%Vergl%" "%Ein%">nul || goto :eof  

:Write
set "Zeile=%Zeile:<=^<%"  
set "Zeile=%Zeile:>=^>%"  
>>"%Aus%" echo %Zeile%  
goto :eof
und bringt mit obigen Testdaten dieses Ergebnis:
Scenario_Online[0,12].Name=R007 <<S_BBG_LLG1-1
Scenario_Online[0,13].Name=R007 >>S_BBG_LLG1-1
Scenario_Online[0,14].Name=R008 <<S_BBG_LLG1-2
Scenario_Online[0,15].Name=R008 >>S_BBG_LLG1-2
Scenario_Online[0,14].Name=R010 <<UMUM 4004
Scenario_Online[0,15].Name=R010 >>UMUM 4004
Grüße
bastla
Member: knechtibus
knechtibus Jul 29, 2009 at 11:31:23 (UTC)
Goto Top
Hallo bastla,

vielen Dank für deine Hilfe. Es funktioniert nun einwandfrei, auch mit der Erweiterung! Habe die Leerzeichen am Ende jeder Zeile entfernt und sowohl die Batch Datei als auch die link.txt in ein anderes Verzeichnis verschoben und nun geht es. Scheinbar hat er sich an dem Verzeichnis gestört. Nochmals vielen Dank.

MfG
ein nun glücklicher knechtibus