2012-06-13 92 views
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=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 
+0

我知道这不是批处理文件的方法,所以可能不适合,但awk和sed都是(linux)命令行工具,用于重新排列这样的文本行。 – Chris

+0

也许你可以从UnxUtils项目中下载'sed'和'awk'版本并在你的批处理文件中使用它们。 – adarshr

回答

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_name相应file_size

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

+0

好的,但这将改变所有变量FILE_NAME&FILE_SIZE,但我想为他们中的一个做 – Leo92

+0

@ user1447199 - 你不应该完全改变你的问题,最好问一个新的问题。这是一个很大的区别,如果它是XML,CSV或自定义格式 – jeb

+0

帮助PLZ,我注意到如果输入文件名在这行中有空格/ f“tokens = *”%% s in(%INPUT_FILE% )做调用:ParseLine“%% s”,我试图把“%INPUT_FILE%”,但它没有工作,有没有解决方案? – Leo92