0

プログラムで生成された拡張子が .trs のテキスト ファイルの行を削除するバッチまたは VBS ソリューションを探しています。

作成されたすべての .trs ファイルには、「labour」という単語を含む行があります。労働という単語を含む行の後のすべての行を削除する必要があります。

.trs ファイルはすべて c:\export に保存されます

私はこれを検索しましたが、いくつかのコマンドは私の頭をはるかに超えていました。どなたか、バッチ ファイル全体をカット アンド ペーストで開いてください。

4

2 に答える 2

3

これは、「labour」という単語の上のすべての行を削除するために(バッチファイルで)探しているコードだと思います。コードを変更する必要がある場合はお知らせください (ファイルに「labour」のインスタンスが複数ある場合など)。

@echo OFF

setLocal EnableDelayedExpansion

cd C:\export
for /f "delims=" %%I in ('findstr /inc:"labour" "test.trs"') do (
set /A"line=%%I"
)

set count=0

for /f "delims=" %%A in (test.trs) do (
If !count! GEQ %line% goto ExitLoop
echo %%A >>temp.txt
set /A count+=1
echo !count!
)

:ExitLoop

type temp.txt > test.trs
del temp.txt

endlocal

出力:

test.trs (変更前)

this
is
a
labour
test
of
the
results

test.trs (変更後)

this
is
a
于 2012-10-01T19:10:03.027 に答える
3

「C:\export」内のすべての .trs ファイルを処理する別の方法を次に示します。

@echo off
if not exist "C:\export\*.trs" goto :EOF
if exist "C:\export\queue.tmp" del /q "C:\export\queue.tmp"
for /f "tokens=*" %%A in ('dir /b "C:\export\*.trs"') do (
  for /f "tokens=1,2 delims=:" %%B in ('findstr /inc:"labour" "C:\export\%%A" ^| findstr /n .*') do if "%%B" equ "1" set LineNumber=%%C
  for /f "tokens=1* delims=:" %%D in ('findstr /n .* "C:\export\%%A"') do if %%D lss %LineNumber% echo.%%E>>"C:\export\queue.tmp"
  move /y "C:\export\queue.tmp" "C:\export\%%A">NUL
)

まず、スクリプトが壊れないようにエラー チェックを行います。次に、C:\exportに格納されている.trsファイルのリストを取得し、各ファイルをループ処理します。

findstr /inc:"labour" "C:\export\%%A"」を使用して、現在のファイルで「labour」が見つかった行番号を取得し、それを「findstr /n .*」にパイプして番号を付けます複数の一致が見つかった場合の結果。

次に、「 tokens=1,2 delims=: 」で for ループを使用して最初の結果を検索し ( if "%%B" equ "1" )、行番号を格納します ( set LineNumber=%%C )。

次に、' findstr /n .* "C:\export\%%A" ' を使用してファイルのすべての行を読み取り、"tokens=1* delims=:"を使用して行番号を再度区切り、すべてのファイルをコピーします。%LineNumber%に達するまでデータを一時ファイルに保存します。ファイルを読み取るこの方法 (findstr を使用して行に番号を付ける) により、for ループで空白行がスキップされないことも保証されます。

最後に、元のファイルを一時ファイルに置き換えてから、次のファイルにループします。

上記のコードをできるだけスリムにしようとしました。以下は、フォーマット、コメント、ビジュアル フィードバック、およびユーザー定義可能な変数を含む同じスクリプトです。

@echo off

::Set user-defined Variables
set FilePath=C:\export
set FileType=*.trs
set Keyword=labour

::Check for files to process and exit if none are found
if not exist "%FilePath%\%FileType%" echo Error. No files to process.&goto :EOF

::Delete temp file if one already exists
if exist "%FilePath%\queue.tmp" del /q "%FilePath%\queue.tmp"

::List all files in the above specified destination, then process them one at a time
for /f "tokens=*" %%A in ('dir /b "%FilePath%\%FileType%"') do (
  ::Echo the text without a line feed (so that "Done" ends up on the same line)
  set /p NUL=Processing file "C:\export\%%A"... <NUL

  ::Search the current file for the specified keyword, and store the line number in a variable
  for /f "tokens=1,2 delims=:" %%B in ('findstr /inc:"%Keyword%" "%FilePath%\%%A" ^| findstr /n .*') do (
    if "%%B" equ "1" set LineNumber=%%C
  )>NUL

  ::Output all data from the current file to a temporary file, until the line number found above has been reached
  for /f "tokens=1* delims=:" %%D in ('findstr /n .* "%FilePath%\%%A"') do (
    if %%D lss %LineNumber% echo.%%E>>"%FilePath%\queue.tmp"
  )>NUL

  ::Replace the current file with the processed data from the temp file
  move /y "%FilePath%\queue.tmp" "%FilePath%\%%A">NUL
  echo Done.
)
于 2012-10-26T06:42:48.187 に答える