mmenzel
Goto Top

Textdateien öffnen, Suchmuster finden, dahinter eine Zeile einfügen, abspeichern

Erstmal "Hallo zusammen", das ist mein erster Post hier im Forum und ich hoffe ich hab die SuFu ausreichend gequält, nicht dass ich doch einen Thread gleich zum Einstieg verstolpert habe.. Und nu zum eigentlich Thema ;)

Ich habe einen ganzen Sack voll Textdateien, die einen solchen Aufbau besitzen:

[txt]
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares,
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares
<MEIN-SUCHMUSTER>
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares,
hier steht irgendwas ganz undefinierbares, hier steht irgendwas ganz undefinierbares
[/txt]

In die Zeile UNTER <MEIN-SUCHMUSTER> soll nun eine neue Zeile eingefügt werden mit "MEIN-TEXT".
Das heißt ich möchte eigentlich nur nach <MEIN-SUCHMUSTER> suchen und eine neue Zeile dahinter "MEIN-TEXT" schreiben. Danach soll die Datei natürlich noch gespeichert werden.
Das Ganze soll nun für einige 1000 Dateien passieren, was bedeutet, dass ich noch ein Konstrukt drumherum brauche, was einfach alle *.txt-Dateien in einem Verzeichnis durchklappert.

Tausend Dank demjenigen, der mir weiterhelfen kann!

//edit:
Ein zusätzliche Schwierigkeit gibts außerdem noch:
Die Dateien liegen nicht alle in einem Verzeichnis, sondern in mehreren -> Aufbau:
root|-abc -frt.txt -342.txt -we3.txt -ew.txt|-def -sd.txt -sds.txt -3hr.txt|-34v -34d.txt -3ds.txt|-3f3 -sd.txt -34d.txt -3ds.txt -sds.txt
Wenn das noch berücksichtigt werden könnte.. Wäre super face-smile

Content-Key: 90982

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

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

Member: bastla
bastla Jun 30, 2008 at 21:08:17 (UTC)
Goto Top
Hallo mmenzel und willkommen im Forum!

Handelt es sich bei "<MEIN-SUCHMUSTER>" um eine komplette Zeile oder nur um einen Teil einer Zeile?
Falls ersteres, würde es eigentlich genügen, die eine Zeile durch 2 Zeilen (die ursprüngliche und die zusätzliche) zu ersetzen.

Grüße
bastla
Member: mmenzel
mmenzel Jun 30, 2008 at 21:20:27 (UTC)
Goto Top
Hallo bastla,
es ist nur ein Teil der Zeile, hier nochmal etwas detaillieter, die Zeile sieht in den verschiedenen Dateien immer so aus:
dieser-text-ist-immer-gleich hier_steht_in_jeder_datei_etwas_anderes
Das heißt die Suche würde immer nach "dieser-text-ist-immer-gleich" und danach müsste eine neue Zeile eingefügt werden.

Gruß
mmenzel
Member: bastla
bastla Jun 30, 2008 at 21:49:23 (UTC)
Goto Top
Hallo mmenzel!

Dann etwa so:
@echo off & setlocal
set "Ordner=D:\Test"  
set "Dateien=*.txt"  
set "Suchbegriff=dieser-text-ist-immer-gleich"  
set "Zusatzzeile=DIE NEUE ZEILE"  

set "IL=%temp%\InsertLine.vbs"  
echo Set args = WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")>%IL%  
echo T=fso.OpenTextFile(args(0)).ReadAll:P=InStr(1,T,args(1),vbTextCompare):If P=0 Then WScript.Quit 1 >>%IL%
echo P=InStr(P,T,vbCrLF):If P^<^>0 Then fso.CreateTextFile(args(0)).Write Left(T,P-1)^&vbCrLF^&args(2)^&Mid(T,P)>>%IL%

for %%i in ("%Ordner%\%Dateien%") do cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile%" || echo Keine Ersetzung in "%%i"  
Da die Ersetzung in den bestehenden Dateien ohne Sicherungskopie erfolgt, bitte zum Testen nur Kopien verwenden.

Bei der Suche wird Groß-/Kleinschreibung nicht unterschieden. Falls der Suchbegriff nicht gefunden wurde, erfolgt eine Fehlermeldung.

Grüße
bastla
Member: bastla
bastla Jun 30, 2008 at 21:53:09 (UTC)
Goto Top
Hallo mmenzel!

Zur Zusatzanforderung: Sollen sämtliche txt-Dateien (auch in Root / nur in Unterverzeichnissen) berücksichtigt werden?

Grüße
bastla
Member: mmenzel
mmenzel Jun 30, 2008 at 22:07:36 (UTC)
Goto Top
Na aber holla, vielen, vielen Dank schonmal bis hierhin.

Die Dateien liegen nur in den Unterverzeichnissen.
Was ich noch erwähnen hätte sollen.. Die Dateien enthalten zwar Reintext, sind aber vom Typ .ghtml. Das Skript läuft leider nicht auch wenn ich "Dateien=*.ghtml" setze - Liegt wohl an dem vb-spezifischen-Code, mein Fehler face-sad.
In die neue Zeile soll übrigens folgendes:
Suchzeile ist: dieser-text-ist-immer-gleich hier_steht_in_jeder_datei_etwas_anderes
Neue Zeile darunter wird: Von-Hand-Einzugebener-Text hier_steht_in_jeder_datei_etwas_anderes8aus der Suchzeile obendrüber)

Es tut mir jetzt schon Leid, hier in meinem ersten Thread immer wieder was ranzuhängen, danke für deinen Mühen, bastla!
Member: bastla
bastla Jun 30, 2008 at 22:17:16 (UTC)
Goto Top
Hallo mmenzel!

Wenn Du in Zeile 2 einen (Test-)Ordner, welcher tatsächlich Dateien vom Typ ".ghtml" enthält, angibst, sollte eine Ersetzung vorgenommen werden - Unterordner werden in der obigen Fassung noch nicht berücksichtigt
Kannst Du bitte eine Datei (bzw deren relevante Zeilen) vor und nach der Ersetzung posten? So ganz klar ist mir noch nicht, was nun in die neue Zeile soll.

Grüße
bastla
Member: mmenzel
mmenzel Jun 30, 2008 at 22:31:06 (UTC)
Goto Top
Machen wir es einfach mal ganz konkret ohne irgendwelche abstrakten Beschreibungen ;)

Vor der Berabeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF9EAD7>
texttexttexttexttext

Nach der Verarbeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF>
x-ID: <3BA88F5611E34166BC786CE75FF9>
texttexttexttexttext

Im Endeffekt steht vorne der Attributname und dahinter der Wert des Attributs selbst.
Bei der Bearbeitung soll eine neue Zeile hinzugefügt werden in welcher unter einem anderen Attributnamen der gleiche Wert wieder zu finden ist. Der Name dieses Attributs kann gerne auch oben bei de SETS gesetzt werden.

Ich hoffe, dass ich nun mal endlich deutlich gesprochen habe, dass es auch zu verstehen war ;)
Member: bastla
bastla Jul 01, 2008 at 09:38:37 (UTC)
Goto Top
Hallo mmenzel!

Das könnte dann so aussehen:
@echo off & setlocal
set "Ordner=D:\Test"  
set "Dateien=*.ghtml"  
set "Suchbegriff=Message-ID: "  
set "Zusatzzeile=x-ID: "  

if "%Ordner:~-1%"=="\" set "Ordner=%Ordner:~,-1%"  
set "IL=%temp%\InsertLine.vbs"  
echo Set args = WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject")>%IL%  
echo T=fso.OpenTextFile(args(0)).ReadAll:P=InStr(1,T,args(1),vbTextCompare):If P=0 Then WScript.Quit 1 >>%IL%
echo P=P+Len(args(1)):P2=InStr(P,T,vbCrLF):If P2^<^>0 Then fso.CreateTextFile(args(0)).Write Left(T,P2-1)^&vbCrLF^&args(2)^&Mid(T,P,P2-P)^&Mid(T,P2) Else WScript.Quit 1 >>%IL%

for /d %%a in ("%Ordner%\*.*") do call :ProcessFolder "%%a"  
goto :eof

:ProcessFolder
for /r %1 %%i in (%Dateien%) do cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile%" || echo Keine Ersetzung in "%%i"  
goto :eof
Als Attributwert wird alles nach dem Attributnamen (%Suchbegriff%) bis zum Zeilenende verwendet.

Nochmals der Hinweis: Bitte zunächst Testdaten verwenden, da die Dateien unmittelbar verändert werden!

Grüße
bastla
Member: mmenzel
mmenzel Jul 01, 2008 at 11:03:03 (UTC)
Goto Top
Heiderdaus, das funktioniert einwandfrei! Ich würde ja gerne an dem Script noch selbst etwas ändern, aber bei diesen wilden Sprachkombinationen verstehe ich nichmal mehr Bahnhof face-sad.
Im Moment sieht das Ganze ja nu so aus:
---
Vor der Berabeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF9EAD7>
texttexttexttexttext

Nach der Verarbeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF>
x-ID: <3BA88F5611E34166BC786CE75FF9>
texttexttexttexttext
---
---
der letzte Schritt wäre nun Folgendes zu erreichen:
--
Vor der Berabeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF9EAD7>
texttexttexttexttext

Nach der Verarbeitung:
texttexttexttexttext
Message-ID: <3BA88F5611E34166BC786CE75FF>
x-ID: <3BA88F5611E34166BC786CE75FF9>
durch-set-festzulegender-begriff_1: durch-set-festzulegender-begriff_2
texttexttexttexttext
--

Es soll quasi noch eine Zeile rangehängt werden die aus zwei variablen besteht, die man durch set festlegen kann.

Ich wollte dir eigentlich ein virtuelles Bier zukommen lassen, mittlerweile sollte es doch eher ein Kasten werden..

ps: Aus was bestht diees Skript nun eigentlich? cmd-commands + vb + ?
Member: Biber
Biber Jul 01, 2008 at 11:24:05 (UTC)
Goto Top
ps: Aus was bestht diees Skript nun eigentlich? cmd-commands + vb + ?
...und einem Sahnehäubchen bastla'scher Inspiration..
Member: bastla
bastla Jul 01, 2008 at 11:58:31 (UTC)
Goto Top
Hallo mmenzel!

Vielleicht liest sich's so etwas leichter:
@echo off & setlocal
set "Ordner=D:\Test"  
set "Dateien=*.ghtml"  
set "Suchbegriff=Message-ID: "  
set "Zusatzzeile1=x-ID: "  
set "Zusatzzeile2=durch-set-festzulegender-begriff_1: durch-set-festzulegender-begriff_2"  

if "%Ordner:~-1%"=="\" set "Ordner=%Ordner:~,-1%"   
set "IL=%temp%\InsertLine.vbs"  

>%IL%  echo Set args=WScript.Arguments
>>%IL% echo Set fso=CreateObject("Scripting.FileSystemObject")  
>>%IL% echo T = fso.OpenTextFile(args(0)).ReadAll
>>%IL% echo P = InStr(1, T, args(1),vbTextCompare)
>>%IL% echo If P = 0 Then WScript.Quit 1
>>%IL% echo P = P + Len(args(1))
>>%IL% echo P2 = InStr(P, T, vbCrLF)
>>%IL% echo If P2^<^>0 Then
>>%IL% echo     fso.CreateTextFile(args(0)).Write _
>>%IL% echo         Left(T, P2 - 1) ^& vbCrLF _
>>%IL% echo         ^& args(2) _
>>%IL% echo         ^& Mid(T, P, P2-P) ^& vbCrLF _
>>%IL% echo         ^& args(3) _
>>%IL% echo         ^& Mid(T, P2)
>>%IL% echo Else
>>%IL% echo     WScript.Quit 2
>>%IL% echo End If

for /d %%a in ("%Ordner%\*.*") do call :ProcessFolder "%%a"  
goto :eof

:ProcessFolder
for /r %1 %%i in (%Dateien%) do (
    cscript //nologo %IL% "%%i" "%Suchbegriff%" "%Zusatzzeile1%" "%Zusatzzeile2%"  
    if errorlevel 1 echo Keine Ersetzung in "%%i"  
)
goto :eof
Zu den Zutaten: Da Stringbearbeitung in Batch vergleichsweise mühsam ist, verwende ich für den Ersetzungs-Part VBScript. Das Erzeugen des Scripts aus dem Batch heraus erleichtert das Handling (es wird so nur eine Datei benötigt).

Für das "Drumherum" ist Batch dann wieder die einfachere Möglichkeit (und daher, wenn Dir "for" geläufig ist - ansonsten "for /?" - hoffentlich auch nicht so schwer nachvollziehbar) .
@Biber face-smileface-smile

Grüße
bastla
Member: mmenzel
mmenzel Jul 01, 2008 at 16:01:13 (UTC)
Goto Top
Aaaah, wunderbar, bastla! Funktioniert alles bestens und genau so wie es sein sollte!
Danke noch für die kleine Erklärung. Ich hoffe, ich kann mich hier an irgendeiner Stelle hier mal halb so nützlich machen, wie du es getan hast - Dankeschön!