【バッチスクリプト】ファイル内から特定の文字列を削除してファイル出力する

いつもお世話になっております。
RfromLです。

今回はCSVファイル内のある項目から指定の文字列を削除してファイル出力する処理についてです。


1.はじめに

CSVファイルを読み込んで、レコードの項目中に含まれる不要な文字列を削除(ブランクに置換)。
不要な文字列を削除した結果をファイル出力する処理です。


2.使用コマンド

指定文字列の削除には「set」コマンドの変数置換により行います。

以下、setコマンドのヘルプ(コマンド「set /?」の実行結果)より

環境変数の置換は、次のように拡張されます:

%PATH:文字列 1 = 文字列 2%

は、PATH 環境変数を展開し、その結果に含まれるすべての "文字列 1" を
 "文字列 2"  に置き換えます。
 "文字列 2" に空の文字列を指定すると、展開された出力からすべての "文字列 1"
を削除することができます。

ヘルプの記載から文字列削除には以下のコマンドとなります。

コマンド例

set %変数:文字列1 =%

イコールの右側に空文字(ブランク)をセットしているので「変数」の中に含まれる「文字列1」が削除(空文字に置換)されます。




3.作成スクリプト

3-1.コード内容

今回作成したスクリプトファイルのコード内容は以下の通りです。

[ CharDel.bat ]

@echo off
@rem ------------------------------------------------------------
@rem システム名         : RfromL.com
@rem 処理ID             : CharDel
@rem 処理名             : 不要文字列削除
@rem 処理内容           : ファイル内から特定の文字列を削除して
@rem                    : ファイル出力する
@rem 作成日             : 2025.03.18
@rem 作成者             : S.Takaaze
@rem パラメータ         : なし
@rem 備考               : 
@rem *** 修正履歴 ***********************************************
@rem No.  日付        修正者              内容
@rem 001  2025.03.18  S.Takaaze  新規作成
@rem ------------------------------------------------------------
@rem - 初期処理
@rem ------------------------------------------------------------
@rem 実行バッチファイルディレクトリ設定
set CMD_PATH=%~dp0

@rem 処理ID設定(バッチファイル名)
set BATCH_ID=%~n0

@rem 処理開始メッセージ表示
echo %BATCH_ID% %DATE:~0,4%年%DATE:~5,2%月%DATE:~8,2%日 %TIME:~0,2%時%TIME:~3,2%分%TIME:~6,2%秒 処理開始

@rem ------------------------------------------------------------
@rem - ファイルディレクトリ設定
@rem ------------------------------------------------------------
@rem 入力ファイルディレクトリ
set IDIR=%CMD_PATH%IN

@rem 出力ファイルディレクトリ
set ODIR=%CMD_PATH%OUT

@rem ------------------------------------------------------------
@rem - ファイルID設定
@rem ------------------------------------------------------------
@rem 入力ファイルID
set IFILEID001=INFILE.txt

@rem 出力ファイルID
set OFILEID001=OUTFILE.txt

@rem ------------------------------------------------------------
@rem - ファイル設定
@rem ------------------------------------------------------------
@rem 入力ファイル
set IFILE001=%IDIR%\%IFILEID001%

@rem 出力ファイル
set OFILE001=%ODIR%\%OFILEID001%

@rem ------------------------------------------------------------
@rem - 前処理 : 出力ファイルクリア処理
@rem ------------------------------------------------------------
if exist "%OFILE001%" del "%OFILE001%"

@rem ------------------------------------------------------------
@rem - ファイル編集出力処理
@rem ------------------------------------------------------------
@rem 遅延環境変数有効
setlocal enabledelayedexpansion

@rem 入力レコードカウンター初期化
set ICNT=0

@rem 出力レコードカウンター初期化
set OCNT=0

@rem 入力ファイル読込
for /F "usebackq tokens=1-2* delims=	" %%a in ("%IFILE001%") do (

  @rem 入力レコード件数カウントアップ
  set /A ICNT=!ICNT!+1

  @rem 文字列「 ニュース」を削除
  set WORKSTR=%%b
  set EDITSTR=!WORKSTR: ニュース=!

  @rem データレコード出力
  @echo %%a	!EDITSTR!	%%c>> "%OFILE001%"

  @rem 出力レコード件数カウントアップ
  set /A OCNT=!OCNT!+1

)

@rem 入力レコード件数表示(頭ゼロ埋め10桁)
set ZEROPAD-ICNT=000000000!ICNT!
@echo   I-FILE !ZEROPAD-ICNT:~-10!件 [ %IFILEID001% ]

@rem 出力レコード件数表示(頭ゼロ埋め10桁)
set ZEROPAD-OCNT=000000000%OCNT%
@echo   O-FILE %ZEROPAD-OCNT:~-10%件 [ %OFILEID001% ]

@rem 遅延環境変数無効
endlocal

@rem ------------------------------------------------------------
@rem - 終了処理
@rem ------------------------------------------------------------
:END

@rem 処理終了メッセージ表示
echo %BATCH_ID% %DATE:~0,4%年%DATE:~5,2%月%DATE:~8,2%日 %TIME:~0,2%時%TIME:~3,2%分%TIME:~6,2%秒 正常終了

@rem 表示メッセージ確認の為、処理一時停止
pause

exit /b 0

※メッセージを確認するため、正常終了処理、異常終了処理のブロックに「pause」を記載して処理を一時停止するようにしています。

3-2.ディレクトリ構成

作成したバッチスクリプトを実行する際のディレクトリ構成です。



3-3.入力ファイル仕様

ファイル項目

 区切り文字:タブ
 改行コード:CRLF
 文字コード:S-JIS


3-4.入力ファイル内容



3-5.機能説明

①ディレクトリ「IN」配下に格納されたファイル「INFILE.txt」を読み込む。
②項目「投資法人」に含まれる文字列「 ニュース」をsetコマンドで削除する。
③文字列を削除後のレコードをファイル出力する。


4.実行結果確認

①入力ファイルの内容を確認




②ファイル出力先のディレクトリにファイルがなにも無いことを確認




③バッチスクリプトをダブルクリックして実行




④表示されたメッセージからコピー処理が実行されていることを確認




⑤出力ファイルの内容を確認

入力レコードすべての「投資法人」項目から不要文字列「 ニュース」が削除されていることを確認


5.おわりに

指定文字列の置換、削除(空文字に置換)については、他にもやりようがありますが、やり方としてはsetコマンドの利用は簡単に行えるので知っていると便利です。

バッチスクリプトでのファイル編集は処理するレコード数、データサイズが増えると処理時間が伸長しやすいので個人用ツールぐらいで使うぐらいが丁度いいかなと思います。

以上です。
宜しくお願い致します。



タイトルとURLをコピーしました