tech.guitarrapc.cóm

Technical updates

バッチ(cmd)で配列(もどき)を使う

本記事は、私が以前Qiitaにて掲載していたものの転載です。 PowerShellerとしては、今更 cmd感 がありますが、まぁ参考程度に (

コマンドプロンプトで配列(もどき)を使う

コマンドプロンプトでは配列は標準サポートされていない

配列処理って何かと便利ですよね? こんなの ↓↓

Array[i]

ところがコマンドプロンプト/バッチ(cmd/bat)は配列を標準サポートしていません。 そこで、ちょっと工夫して配列もどきを実現してみました。

配列対象にしたい実データが縦に並んだ別ファイルと連携させています

配列にいれるデータCSVファイルの例

このようなcsvを各行配列に入れたいものとします。

Hello
World!!
Good
Morning

バッチで配列処理サンプル

何も難しいことはありません。FOR内部での処理を行うため、遅延環境変数を利用しています。 配列処理例ソース:

:SETDelayedExpansionEnable
SETLOCAL enabledelayedexpansion

:SetArrayIndex
SET Array_Index=0

:SetCSVFile
SET CSV_file=Data_list.csv

:SetArray
FOR /F %%I IN (%CSV_file%) DO (
    SET /a Array_Index=!Array_Index!+1
    SET Array[!Array_Index!]=%%I
)

:EchoArray
FOR /L %%L IN (1,1,%Array_Index%) DO (ECHO Array[%%L]=!Array[%%L]!)

結果表示

以下のように表示されたはずです。

Array[1]=Hello
Array[2]=World
Array[3]=Good
Array[4]=Morning

利用例

用途は人によってでしょうが、私の場合は、複数の対象DBインデックスごとにSQLを生成、実施、生成CSVファイルもそのDBインックスの名称を入れる必要がある、という状況で必要に迫られ作成しました。 配列を使うことで、FOR /Lと併用することで一般的なFor/Array処理を展開できるため重宝します。

:SetSQLLine
SET SQL_Line1=OUTPUT_TO %CSV_file%
SET SQL_Line2=SELECT %Column1% FROM %Table1%
SET SQL_Line3=AND %Column2% FROM %Table2%
SET SQL_Line4=WHERE t1.%TableJoin1% EQ t2.%TableJoin2%

:CreateSQLFile
FOR /L %%L IN (%Initial%,%Step%,%ARRAY_INDEX%) DO (
    ECHO %SQL_Line1%_!Array[%%L]!.csv >>%SQL_file%
    ECHO %SQL_Line2% t1>>%SQL_file%
    ECHO %SQL_Line3%.!Array[%%L]! t2>>%SQL_file%
    ECHO %SQL_Line4% >>%SQL_file%
)

まとめ

コマンドプロンプトでも、遅延環境変数と併用することで配列処理はできます。 煩雑なコードが目に見えてすっきりする+動的処理が可能になるので便利ですよ (本音:PowerShellつかいましょう)