【バッチスクリプト】変数に格納された数値を頭0埋めする処理


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

今回は変数に格納された数値を指定桁数で頭0埋め(ゼロパディング)する処理についてです。

1.はじめに

今回はバッチスクリプトで変数内に格納された数値を指定桁で頭0埋めする方法についてです。

例として以下のようなコードを実行します。

@echo off

@rem 各変数に数値をセット
set CNT_A=1
set CNT_B=20
set CNT_C=300
set CNT_D=4000

echo 各変数を表示
echo CNT_A:%CNT_A%
echo CNT_B:%CNT_B%
echo CNT_C:%CNT_C%
echo CNT_D:%CNT_D%
echo.

@rem 各変数に1加算
set /A CNT_A=%CNT_A%+1
set /A CNT_B=%CNT_B%+1
set /A CNT_C=%CNT_C%+1
set /A CNT_D=%CNT_D%+1

echo 加算後表示
echo CNT_A:%CNT_A%
echo CNT_B:%CNT_B%
echo CNT_C:%CNT_C%
echo CNT_D:%CNT_D%
echo.

pause

exit /b 0

上記のコードをバッチスクリプトとして実行します。

変数に格納した値、それぞれの変数に1加算した値が表示されます。
今回はこの数値を右詰め、頭ゼロ埋めにして表示するようにする方法です。


2.使用コマンド

頭0埋めには「set」コマンドの展開の副文字列を指定を使用します。

[ コマンド例 ]

また、展開の副文字列を指定することもできます。

    %PATH:~10,5%

は、PATH 環境変数を展開し、展開結果の 11 番目 (オフセット 10) の文字
から始まる 5 文字だけを使います。長さが指定されなかった場合は、変数の
値の残りの長さを既定値とします。オフセットまたは長さのどちらかが負の値
の場合、環境変数の値の長さに指定されたオフセットまたは長さをたしてその
数を使います。

    %PATH:~-10%

は、パス変数の最後の 10 文字が展開されます。

    %PATH:~0,-2%

は最後の 2 文字以外のすべてが展開されます。

今回は上記2つめの例「%PATH:~-10%」の部分を使用します。

「はじめに」で提示したコードに展開の副文字列指定を反映させて桁数5桁で頭ゼロ埋めになるように以下のように修正しました。

@echo off

@rem 各変数に数値をセット
set CNT_A=1
set CNT_B=20
set CNT_C=300
set CNT_D=4000

echo 各変数を表示
echo CNT_A:%CNT_A%
echo CNT_B:%CNT_B%
echo CNT_C:%CNT_C%
echo CNT_D:%CNT_D%
echo.

@rem 各変数に1加算
set /A CNT_A=%CNT_A%+1
set /A CNT_B=%CNT_B%+1
set /A CNT_C=%CNT_C%+1
set /A CNT_D=%CNT_D%+1

@rem 各変数の頭に5桁のゼロを結合
set ZEROPAD_CNT_A=00000%CNT_A%
set ZEROPAD_CNT_B=00000%CNT_B%
set ZEROPAD_CNT_C=00000%CNT_C%
set ZEROPAD_CNT_D=00000%CNT_D%

echo 加算後表示
echo CNT_A:%ZEROPAD_CNT_A:~-5%
echo CNT_B:%ZEROPAD_CNT_B:~-5%
echo CNT_C:%ZEROPAD_CNT_C:~-5%
echo CNT_D:%ZEROPAD_CNT_D:~-5%
echo.

pause

exit /b 0

修正したスクリプトを実行すると以下のようになります。

変数の値が5桁の頭ゼロ埋めで表示されるようになりました。
修正内容としては、以下のコードの部分

@rem 各変数の頭に5桁のゼロを結合
set ZEROPAD_CNT_A=00000%CNT_A%
set ZEROPAD_CNT_B=00000%CNT_B%
set ZEROPAD_CNT_C=00000%CNT_C%
set ZEROPAD_CNT_D=00000%CNT_D%

もとの変数に「00000」(ゼロを5つ)を結合して新たに変数に格納します。


echo 加算後表示
echo CNT_A:%ZEROPAD_CNT_A:~-5%
echo CNT_B:%ZEROPAD_CNT_B:~-5%
echo CNT_C:%ZEROPAD_CNT_C:~-5%
echo CNT_D:%ZEROPAD_CNT_D:~-5%

echoで「00000」を結合した変数を表示する際に「~-5」で変数内の最後の5文字を切り取って展開するよう指定するようにしています。


3.使用例

使用例としてファイルを読み込んで、そのまま別のファイルに出力する処理のバッチスクリプトを作成しました。
この処理の件数表示箇所を頭ゼロ埋めで表示するようにします。

3-1.コード内容

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

[ ZeroPadding.bat ]

@echo off
@rem ------------------------------------------------------------
@rem システム名         : RfromL.com
@rem 処理ID             : ZeroPadding
@rem 処理名             : 頭ゼロ埋め(ゼロパディング)
@rem 処理内容           : ファイルを1レコードづつ読み込んで
@rem                    : 1レコードずつ出力する
@rem 作成日             : 2025.03.19
@rem 作成者             : S.Takaaze
@rem パラメータ         : なし
@rem 備考               : 
@rem 
@rem *** 修正履歴 ***********************************************
@rem No.  日付        修正者              内容
@rem 001  2025.03.19  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=*" %%a in ("%IFILE001%") do (

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

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

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

)

@rem 入力レコード件数表示
set ZEROPAD-ICNT=000000000%ICNT%
@echo   I-FILE %ZEROPAD-ICNT:~-10%件 [ %IFILEID001% ]


@rem 出力レコード件数表示
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.機能説明

①for文でファイルを読み込みファイルの中身が無くなるまで以下 a.~c.の処理を繰り返し
 a.入力件数をカウントアップ(1加算)
 b.読み込んだファイルのレコードを出力
 c.出力件数をカウントアップ
②入力件数を頭ゼロ埋めの10桁で表示
③出力件数を頭ゼロ埋めの10桁で表示

4.実行結果確認

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

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

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




④表示されたメッセージを確認

出力されたメッセージの入力件数、出力件数が頭ゼロ埋めの10桁で表示されていることを確認


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



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