1

入力テキストファイルを読み取り、そこから情報を抽出して出力ファイルに入れるバッチファイルを書きたいと思います。

  1. 入力ファイルの各行には異なる情報が含まれているため、バッチで各行をループさせたいと考えています。
  2. 入力ファイルから特定の情報を抽出し、残りを破棄したいと考えています。
  3. 入力ファイルには、任意の数の行を含めることができます。
  4. 入力行に有用な情報がない場合にエラー メッセージを残したい。
  5. 2 つのカウンターが必要です。1 つ目は入力ファイルの行数を示し、2 つ目は出力ファイルの行数を示します (空の行はカウントしません)。
  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=XXXandの部分だけを抽出FILE_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ループはファイルを 1 行ずつ読み取り、各行の内容が入力引数としてParseLineサブルーチンに送られます。
  2. ParseLineサブルーチンは各行を受け取り、スペースで区切られた単語を反復処理します (こちらでstr説明されている jeb の高度な方法を使用)。 サブルーチン ループのロジックは非常に単純です。各単語を( の前のテキスト) と( の後のテキスト) に分割し、それに応じて設定します。
    tag=value=file_namefile_size

このメソッドは、特殊文字の有無にかかわらず、ほとんどすべての入力ファイルを処理できると思います。

于 2012-06-13T16:41:55.237 に答える