2012-06-13 116 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