本記事は、私が以前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つかいましょう)