2016-11-01 2 views
-1

Я хочу, чтобы добавить строку в серию текстовых файлов во вложенных папках после переменной строки:как добавить строку в серию текстовых файлов после переменной строки

каждого текстового файла с именем data.txt

мои текстовые файлы содержат такие строки:

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

каждый текстовый файл имеет разнообразные линии данных n-й,

все, что я хочу добавить (п + 1) -го линии данных после эти n'th линии в каждых текстовых файлах:

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

Я хочу использовать пакетный файл для выполнения этой задачи.

+0

Вид путаных примеров. Итак, если последняя строка '[data.100 = fx_pqr]', какова будет следующая строка? – Squashman

+0

[data.101 = 'некоторые постоянные текстовые данные'] – kvari

ответ

0

получить последний счетчик, увеличить его на единицу и добавить новую строку:

@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, чтобы соответствовать последнему комментарию и canged вопрос. Вставка в файл невозможна, вам нужно переписать весь файл. Это может иметь плохую производительность со многими/большими файлами.

@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

мы можем поместить эту (n + 1) -ую новую строку сразу после (n) -й строки, а не непосредственно в конец текстовых файлов, так как есть еще некоторые другие текстовые строки до и после этой [data.n = 'some text'] группы данных. – kvari

+0

Большое спасибо, вы настоящий волшебник. я отдам его завтра, так как я сейчас далеко от своего компьютера. кажется, что практически невозможно напрямую добавить (n + 1) -ю строку после (n) -го без переписывания всего текстового файла. – kvari

+0

не только * практически * невозможно. Это связано с тем, как информация хранится на диске (последовательная). Технически, было бы достаточно переписать «только» данные после добавленных байтов, но я не знаю никакого инструмента, который с ним связан (в отношении текстовых файлов. Базы данных работают по-разному). Легче всего переписать весь файл. – Stephan

Смежные вопросы