批量处理输入文件

时间:2012-06-13 13:39:06

标签: batch-file

我想编写一个批处理文件来读取输入文本文件,从中提取信息将其放入输出文件中。

  1. 输入文件中的每一行都有不同的信息,所以我希望批处理循环遍历每一行。
  2. 我想从输入文件中提取某些信息并丢弃其余信息。
  3. 输入文件可以包含任意数量的行。
  4. 如果输入行没有有用的信息,我想留下一条错误消息。
  5. 我需要两个计数器,第一个告诉输入文件中的行数,第二个告诉输出文件中的行数(不计算空行)。
  6. 我希望批处理能够处理普通字母等特殊字符。
  7. 例如:

    FILE_NAME=apple FILE_SIZE=312     C=fwef sdf asdetg
    
    FILE_SIZE=7867 C=ehtrghr  FILE_NAME=sea&ocean G=tryr    yujg
    C=gert FILE_NAME=chair=12 tgrgd sfsf FILE_SIZE=66
    dfgg ertergf C=ert A=344
    
    fgdfg FILE_NAME=cat
    

    我想只提取FILE_NAME=XXXFILE_SIZE=XXX部分,放弃该行中的所有其他内容。输出应为:

    -name apple -size 312
    -name sea&ocean -size 7867
    -name chair=12 -size 66
    ERROR!!!
    -name cat
    
     input_count=5 and output_count=4
    

1 个答案:

答案 0 :(得分:2)

人们没有给批量脚本足够的信任。试试这个:

@echo off
setlocal enableDelayedExpansion
set INPUT_FILE=input.txt
set OUTPUT_FILE=output.txt
set INPUT_COUNT=0
set OUTPUT_COUNT=0

:: Read the input file
for /f "tokens=*" %%s in (%INPUT_FILE%) do call :ParseLine "%%s"
echo. >>%OUTPUT_FILE%
echo input_count=!INPUT_COUNT! and output_count=!OUTPUT_COUNT! >>%OUTPUT_FILE%
exit /b

:: Parse one line and write to output
:ParseLine
set "str=%~1"
set ^"str=!str: =^

!"
set file_name=
set file_size=
for /f "eol=  tokens=1,2 delims==" %%a in ("!str!") do (
    set "tag=%%a"
    set "value=%%b"
    if "!tag!" equ "FILE_NAME" set "file_name=-name !value!"
    if "!tag!" equ "FILE_SIZE" set "file_size=-size !value!"
)
set /a input_count+=1
if "!file_name!" equ "" if "!file_size!" equ "" (
    echo ERROR^^!^^!^^! >>%OUTPUT_FILE%
    goto Done
)
echo.!file_name! !file_size! >>%OUTPUT_FILE%
set /a output_count+=1
:Done

以下是对此的解释:

  1. 第一个for循环逐行读取文件,每行的内容作为输入参数发送到ParseLine子例程。
  2. ParseLine子程序接收str中的每一行并迭代其空格分隔的单词(使用jeb的高级方法here)。
    子程序循环的逻辑非常简单:它将每个单词分成tag=之前的文本)和value=之后的文本),以及相应地设置file_namefile_size
  3. 我相信这个方法几乎可以处理任何输入文件,包含或不包含特殊字符。