Как найти и заменить число в файле и увеличить его? - PullRequest
0 голосов
/ 10 января 2019

У меня 5000 одинаковых файлов, и мне нужно обновить числовое значение в его содержимом и увеличить его. Ниже приведен пакетный скрипт, который я использую для поиска и замены числа в определенном файле с именем BULK_1.txt.

Я не уверен, как увеличить значение после выполнения поиска и замены.

@echo off 
setlocal EnableExtensions DisableDelayedExpansion

set search=01118596270001
set replace=01118596270002

set "textFile=BULK_1.txt"
set "rootDir=C:\Batch"

for %%j in ("%rootDir%\%textFile%") do (
    for /f "delims=" %%i in ('type "%%~j" ^& break ^> "%%~j"') do (
        set "line=%%i"
        setlocal EnableDelayedExpansion
        set "line=!line:%search%=%replace%!"
        >>"%%~j" echo(!line!
        endlocal
    )
)
endlocal

Результат должен быть как ниже. Последние 4 цифры должны быть обновлены с 0001 до 5000 для каждого файла

Содержимое BULK_1.txt:

DMAIN            Test_data        01118596270001
DDOC_DATA        Test_docdata     01118596270001

Содержимое BULK_2:

DMAIN            Test_data        01118596270002
DDOC_DATA        Test_docdata     01118596270002

Содержимое BULK_3:

DMAIN            Test_data        01118596270003
DDOC_DATA        Test_docdata     01118596270003

Ответы [ 2 ]

0 голосов
/ 10 января 2019

«У меня 5000 одинаковых файлов» - гораздо быстрее написать их с нуля, чем редактировать каждый из них:

@echo off
setlocal enabledelayedexpansion

set "Hdr=DMAIN            Test_data        0111859627"
set "Dta=DDOC_DATA        Test_docdata     0111859627"

for /l %%a in (1,1,5000) do (
  set "num=0000%%a"     REM prepend some zeros
  set "num=!num:~-4!"   REM take last four chars
  >Bulk_%%a.txt (
    echo %Hdr%!num!
    echo %Dta%!num!
  )
)
0 голосов
/ 10 января 2019

В соответствии с вашими требованиями вам может понадобиться:

@echo off
setlocal EnableDelayedExpansion

for /L %%A IN (1 1 5000) do (
    set num_processed=%%A
    call:find_len num_processed
    if !len! EQU 1 (set num_%%A=0111859627000%%A)
    if !len! EQU 2 (set num_%%A=011185962700%%A)
    if !len! EQU 3 (set num_%%A=01118596270%%A)
    if !len! EQU 4 (set num_%%A=0111859627%%A)
)

for /L %%A IN (1 1 5000) do (
    for /L %%B IN (1 1 2) do (
        if %%B EQU 1 (
            echo DMAIN            Test_data        !num_%%A!>BULK_%%A.txt
        ) else (
            echo DDOC_DATA        Test_docdata     !num_%%A!>>BULK_%%A.txt
        )
    )
)

:find_len
set "s=!%~1!#"
set "len=0"
for %%P in (4 2 1) do (
    if "!s:~%%P,1!" NEQ "" ( 
        set /a "len+=%%P"
        set "s=!s:~%%P!"
    )
)

Мой код использует то, что @jeb предложил здесь слегка отредактировано.

  • Сначала мы делаем цикл для подсчета от 1 до 5000.
    • Мы хотим посчитать длину каждого из этих чисел. call с помощью подпрограммы find_len делает это.
    • If длина строки переменной равна 1, тогда она должна быть 0001. Число впереди одинаково во всех случаях.
    • If длина строки переменной равна 2, тогда она должна быть 0010. Число впереди одинаково во всех случаях.
    • If длина строки переменной равна 3, тогда она должна быть 0100. Число впереди одинаково во всех случаях.
    • If длина строки переменной равна 4, тогда она должна быть 1000. Число впереди одинаково во всех случаях.

Примечание. Если мы попробуем что-то похожее на set /a 0000+1, результат будет 1. Вот почему все это усложняет! .

Во всех случаях имена переменных будут num_numberCurrentlyProcessed.

  • Теперь еще один цикл, фактически такой же, как и раньше. Он зациклится 5000 раз и создаст 5000 файлов в формате BULK_num.txt.
    • Внутри этого цикла требуется другой цикл от 1 до 2, поскольку каждый файл должен иметь 2 строки.
    • If мы находимся в строке 1, мы echo конкретный текст, указанный в OP.
    • If мы в строке 1, мы echo снова конкретный текст, указанный в OP.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...