2016-11-01 2 views
-1

ich eine Linie zu einer Reihe von Textdateien in Unterordner nach einer variablen Zeile hinzufügen mag:wie eine Zeile in eine Reihe von Textdateien nach einer variablen Zeile hinzufügen

jede Textdatei data.txt

benannt

meine Textdateien enthalten solche Zeilen:

some text ... 
[data.0 = fx_abc] 
[data.1 = fx_xyz] 
... 
[data.n = fx_pqr] 
... some text 

jede Textdatei hat eine abwechslungsreiche n-ten Datenleitung,

alles, was ich hinzufügen möchte, ist die (n + 1) -te Datenleitung nach diese n-ten Zeilen in jeder Textdatei:

[data.(n+1) = fx_some text] 

Ich mag eine Batch-Datei verwenden, um diese Aufgabe auszuführen.

+0

Eine Art verwirrende Beispiele. Wenn also die letzte Zeile '[data.100 = fx_pqr]' ist, wie lautet die nächste Zeile? – Squashman

+0

[data.101 = 'einige konstante Textdaten'] – kvari

Antwort

0

den letzten Zähler erhalten, erhöhen sie durch ein und fügen Sie die neue Linie:

@ECHO OFF 
SETLOCAL enabledelayedexpansion 
REM for every textfile here and all subfolders... 
for /r %%f in (data.txt) do (
    REM a default value if no match found: 
    set "last=none" 
    REM get last counter: 
    for /f "tokens=2 delims=. " %%a in ('type "%%f"^|findstr /b /c:"[data."') do set "last=%%a" 
    REM if not default value... 
    if not "!last!" == "none" (
    REM increase counter: 
    set /a last+=1 
    REM append line: 
    echo [data.!last! = some_text]>>"%%f" 
) 
) 

EDIT letzten Kommentar und canged Frage entsprechen. Das Einfügen in eine Datei ist nicht möglich, Sie müssen die gesamte Datei neu schreiben. Dies kann eine schlechte Leistung mit vielen/großen Dateien haben.

@ECHO OFF 
SETLOCAL enabledelayedexpansion 
REM for every textfile here and all subfolders... 
for /r %%f in (data.txt) do (
    REM a default value if no match found: 
    set "last=none" 
    REM get last counter: 
    for /f "tokens=1,2,* delims=. " %%a in ('type "%%f"^|findstr /b /c:"[data."') do (
    set "last=%%b" 
    set "line=%%a.%%b %%c" 
    set /a new=last+1 
) 
    REM read file line by line and rewrite it: 
    ( 
    for /f "usebackq delims=" %%a in ("%%f") do (
     echo %%a 
     REM if that was the last "[data" line, add the new line: 
     if "%%a"=="!line!" echo [data.!new! = some_text] 
    ) 
)>"%%f.new" 
    REM move the output file to the original name [/y = overwrite] 
    move /y "%%f.new" "%%f" >nul 
) 
+0

können wir diese (n + 1) ne neue letzte Zeile direkt nach der (n) ten Zeile platzieren anstatt direkt an das Ende der Textdateien, da es noch immer sind einige andere Textzeilen vor und nach dieser Datengruppe [data.n = 'irgendein Text']. – kvari

+0

Vielen Dank, du bist ein wahrer Zauberer. Ich werde es morgen ausprobieren, da ich jetzt von meinem PC weg bin. es scheint so, als ob es praktisch unmöglich ist, die (n + 1) te Zeile nach dem (n) ten direkt hinzuzufügen, ohne die Gesamtheit der Textdateien neu zu schreiben. – kvari

+0

nicht nur * virtuell * unmöglich. Es ist, weil die Informationen auf der Festplatte gespeichert sind (sequenziell). Technisch würde es genügen, "nur" die Daten nach den hinzugefügten Bytes neu zu schreiben, aber ich kenne kein Werkzeug, das damit zu tun hat (bezüglich Textdateien. Datenbanken funktionieren anders). Es ist einfacher, die ganze Datei neu zu schreiben. – Stephan

Verwandte Themen