CSVファイルを扱う業務は多く、バッチファイルでもCSVデータを自動処理したいというニーズがあります。たとえば、顧客一覧からメールを一括送信したり、ファイル名と保存先が記載されたCSVをもとにコピー処理を行うなど、さまざまな業務に応用可能です。
この記事では、バッチファイルを使ってCSVファイルを読み取り、行ごとにデータを処理する基本構文と応用例を紹介します。
基本構文:for /f を使ってCSVを読み込む
バッチファイルでCSVを1行ずつ読み込むには for /f
を使います。カンマ区切りのデータをトークンとして分割し、各値を変数に格納して処理できます。
@echo off
setlocal
for /f "tokens=1,2,3 delims=," %%A in (input.csv) do (
echo 名前: %%A
echo メールアドレス: %%B
echo 電話番号: %%C
echo.
)
endlocal
上記の例では、input.csv
というファイルを読み込み、1列目を%%A
、2列目を%%B
、3列目を%%C
に格納しています。
CSVのサンプルデータ
田中一郎,tanaka@example.com,090-1111-2222
山田花子,yamada@example.com,080-3333-4444
佐藤健,satou@example.com,070-5555-6666
このデータを読み込むことで、各行の名前・メールアドレス・電話番号を順に処理できます。
ヘッダー行をスキップする方法
CSVファイルにヘッダーがある場合は、最初の行を読み飛ばす処理を追加します。
@echo off
setlocal enabledelayedexpansion
set "SKIP=1"
for /f "tokens=1,2,3 delims=," %%A in (input.csv) do (
if !SKIP! EQU 1 (
set "SKIP=0"
rem ヘッダー行をスキップ
) else (
echo 名前: %%A
echo メール: %%B
echo 電話: %%C
echo.
)
)
endlocal
enabledelayedexpansion
を使うことで、ループ内で動的に変化する変数(!SKIP!
)を扱えます。
読み取ったデータを使って処理を行う
たとえば、CSVに「ファイル名,コピー先ディレクトリ」という形式で記録されている場合、以下のようにしてファイルをコピーできます。
@echo off
setlocal
for /f "tokens=1,2 delims=," %%A in (copy_list.csv) do (
echo %%A を %%B にコピーします
copy "%%A" "%%B"
)
endlocal
これにより、業務で扱うファイル操作や移動処理などを一括で自動化できます。
注意点と実用上のポイント
- 日本語を含むCSVは、BOM付きUTF-8やShift-JISで保存しないと文字化けすることがあります。
- スペースやカンマがフィールド内にある場合、正しく分割されない可能性があるため、データ形式を事前に整えておくと安全です。
- 二重引用符付きのCSV(”name”,”email”など)には対応していないため、PowerShellやPythonと併用するのも有効です。
まとめ
バッチファイルでもCSVを使ったデータ処理は可能で、特に定型的な作業に対しては非常に有効です。以下のような用途での活用が見込めます。
- ユーザー情報の一括出力・加工
- 複数ファイルの自動コピー・移動
- CSVを使った設定ファイルの動的制御
より複雑な処理にはPowerShellやスクリプト言語との併用も視野に入れつつ、まずはバッチでできる範囲を活用してみましょう。