如何在文件中查找和替换数字并递增?

时间:2019-01-10 08:31:11

标签: batch-file

我有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 :(得分:0)

根据您的要求,您可能需要:

@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建议对https://docs.google.com/forms/d/e/1FAIpQLSfCnRaa4b1VuHhE4gVekWJc_V0Zt4XiTlsKsTipTlPg5ECA7Q/viewform进行稍微编辑的方式。

  • 首先,我们进行一个循环以从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次,并以BULK_num.txt格式创建5000个文件。
    • 在此循环中,需要从1到2的另一个循环,因为每个文件必须有2行。
    • If在第1行,我们echo由OP指定的特定文本。
    • If在第1行,我们再次echo由OP指定的特定文本。

答案 1 :(得分:0)

“我有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!
  )
)