SI業界で脱トノサマSE

上流SI企業のSEがトノサマ商売を脱却するために技術を学ぶためのブログ

CSVファイルをマージするバッチファイル(Windows)

こんにちは。脱トノ(@DatsuTONOSAMA)です。
今日はちょっと短いですが、Windowsバッチについて。

業務でPGを書いているとよくあるのがCSVファイルの取り込み。
特にマスタ登録する際にはよく使われると思います。
また、そのマスタがユーザに設定してもらうものだったり、開発者がそれぞれで設定するものだったりすると、そのCSVファイルたちを一つにまとめたくなる時があります。
そんなときにこのバッチファイルを使うと便利ですね。

バッチの概要

まずはバッチファイルの中身です。

@echo off

chcp 65001

for /f %%a in ('dir /s /b /a-d *.csv')do (
for /f "tokens=* skip=1" %%b in (%%a) do (
echo %%b>>merge.csv
))

非常に単純で、バッチファイルが存在しているフォルダ配下にある.csvファイルを、1行目を無視してmerge.csvファイルにマージするものです。個別に処理の内容を見てみます。

1ブロック目:おまじない

@echo off

chcp等のコマンドがプロンプト上に出てこないようにしてます。

2ブロック目:文字コード変換

chcp 65001

今回のバッチファイルでは、取り込み対象のCSVファイルの文字コードUTF-8であることを想定しています。
Windowsコマンドプロンプトはデフォルトで文字コードSJISであるため、chcp 65001文字コードを設定し直しています。
ここで設定している65001はコードページ番号と呼ばれるもので、Microsoftの公式ページに他の文字コードに対応する番号も記載されています。
ちなみにデフォルトのSJIS932です。
Code Page Identifiers (Windows)

3ブロック目:メイン処理

for /f %%a in ('dir /s /b /a-d *.csv')do (
for /f "tokens=* skip=1" %%b in (%%a) do (
echo %%b>>merge.csv
))

for文がネストしています。それぞれのfor文では以下の処理を実施しています。

1つ目のfor文:for /f %%a in ('dir /s /b /a-d *.csv')do (

カレントパスより下に存在する.csvファイルごとに処理を実施しています。dir /s /b /a-d *.csvの処理結果を%%aで受取り、for文を回しています。
dirコマンドのオプションについては下記を参照するのがわかりやすいと思います。ここでは以下のオプションを指定しています。

www.k-tanaka.net

2つ目のfor文: for /f "tokens=* skip=1" %%b in (%%a) do (

ここがまさにCSVファイルを取り込んでいるところです。
上の階層から渡ってきたファイル名(%%a)の中身に対し、1行目をスキップして処理を実施しています。
なぜ1行目をスキップしたかというとヘッダ行が含まれていたから。不要な場合は"tokens=* skip=1"の記述を消してしまって問題ありません。

吐き出し処理

最後のecho %%b>>merge.csvがまさにファイルを吐き出しているところです。
該当したすべてのCSVファイルについて、1つのmerge.csvにまとめています。

なお、こちらをうまく書き換えてあげれば同じ名前ごとにマージ後のファイルを作成することもできます。
※今手元にWindowsの環境がないので、イメージで書きます。

echo %%b>>%%a_merged.csv






Excelテキストエディタを使ってももちろん良いのですが、繰り返し実行したりする可能性がある場合は手軽に実行できるようにしたいですね。世の中にはバッチ芸人なる職人技を持った人もいるみたいです(類義語:シェル職人)。
今まで私の周りにはあまりバッチファイルを作ろうとする人がいませんでしたが、単純な処理であればササッと作れてしまうので、広めていきたいです。