1

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

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

例如:

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=XXXandFILE_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
4

1 回答 1

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 的高级方法)。
    子例程循环的逻辑非常简单:它将每个单词分成tag(前面的文本=)和value(后面的文本=),并相应地设置file_namefile_size

我相信这种方法几乎可以处理任何输入文件,无论有无特殊字符。

于 2012-06-13T16:41:55.237 回答