複数のcsvやtxtファイルを結合したい
ログデータやトランザクションデータなどのデータを結合して1つのファイルにしたいというときが訪れることがあります。
結合するファイルが数ファイルであれば手作業でコピーしても大した苦労はしないでしょう。
しかし、結合対象のファイルが何十何百と合った場合だとどうでしょうか?結合するファイルが膨大だと手作業では非常に効率が悪く、自動化の必要性も出てきます。
そこで今回は、csv・txtファイルを一括で結合する方法を解説していきます。
複数のcsvやtxtファイルを結合する方法
複数のcsv・txtを結合する方法はいくつかありますので、それぞれ順番に解説していきます。
バッチファイルを使う
バッチファイルとは、コマンドプロンプトで実行できるコマンドを記述したファイルのことです。バッチファイルに複数のコマンドを書きまとめておくことで、処理の自動化が行えるのです。
バッチファイルなんて聞いたことが無い・使ったことがないという方が多いかもしれませんが、コピーペーストでできますので、知識が全くなくても大丈夫です。
まずはcsvの結合を解説していきます。
作成したmarge.batをテキストエディタで開き、以下のテキストを書き込んで保存します。
copy *.csv __result.csv
保存したらテキストエディタを閉じてもらって問題ありません。
この__result.csvが、同一フォルダ内にある全てのcsvファイルが結合されたファイルです。試しにテキストエディタやエクセルなどで開いてみてください。
しっかり、1つのファイルにまとめることができているはずです。
txtファイルの場合は?
テキストファイルの場合は、merge.batの中身を以下のものに書き換えてください。
copy *.txt __result.txt
このコマンドを保存したバッチファイルを実行すると、同一フォルダ内のtxtファイルが全て結合された__result.txtが生成されます。
コマンドプロンプトで結合する
コマンドプロンプトから複数ファイルを結合することも可能です。
起動したら、コマンドプロンプト上で開いているフォルダ(カレントディレクトリ)を変更する必要があります。
この際貼り付けコマンドは「Ctrl+V」ではなく右クリックですので、間違えないようにしましょう。
これで、csvファイルがあるフォルダにコマンドプロンプトでアクセスできている状態です。
この状態でcsvファイルを結合それ以下のコマンドを打ち込み、エンターキーを押してみてください。
copy *.csv __result.csv
コマンドプロンプトを使う場合はこの方法で結合できます。ですが、予めコマンドを入力しておいたバッチファイルを使うほうが簡単ですので、覚えておくと良いでしょう。
Windows Power Shellで結合する
Windows10ではコマンドプロンプトではなくWindows Power Shellが標準コマンドラインインターフェイスとなっています。
Windows Power Shellはタスクバーからではなく、エクスプローラーから起動することができるます。
その関係で、Windows Power Shellを起動する際に開いていたフォルダがカレントディレクトリとなり、cdコマンドを使ってフォルダを移動する必要がありません。
コマンド操作初心者ならコマンドプロンプトよりWindows Power Shellのほうが扱いやすいでしょう。
PoweShellの起動はエクスプローラー左上の「ファイル」から行えます。
開いていたフォルダがカレントディレクトリになっているので、cdコマンドを打ち込む必要はありません。すぐにcopyコマンドで結合可能です。
copy *.csv __result.csv
コマンドプロンプトを使用した時と同じように、上記コマンドを実行するだけでフォルダ内のcsvファイルが全て結合されます。
txtファイルを全て結合したい場合は以下のコマンドを使ってください。
copy *.txt __result.txt
csvファイルのヘッダーを統一する方法
通常の結合方法をとると、ヘッダー行の有無に関わらず全ての行が結合されます。
txtファイルであれば全く問題ない動作ですが、csvの場合はヘッダー行は1ファイルだけでいいという事が多いでしょう。
その場合は以下のコマンドをmerge.bat(バッチファイル)にコピーペーストして保存してください。
@echo off setlocal enabledelayedexpansion set /a counter=0 for /f %%i in ('dir /b *.csv') do ( echo %%i if !counter!==0 ( set /p _head=<%%i echo !_head!>>result.csv ) set /a counter=!counter!+1 for /f "tokens=* skip=1" %%b in (%%i) do ( echo %%b>>result.csv ) )
かなり複雑なコマンドで、プログラミング経験が必要となる記述ですので、コマンドの解説は省略します。
コマンドを保存したら、merge.batを実行してみてください。ヘッダー行が1行目だけになり、以降は全てヘッダー行以外のデータになっています。
csv・txtファイルを結合する際のポイント
csvやtxtファイルを結合する際にいくつか押さえておきたいポイントがあります。どんなファイルでもキレイに結合できるわけではないので、しっかり仕組みを覚えておきましょう。
結合順序はアルファベット順
今回紹介した方法は非常に手軽に複数ファイルを結合できますが、結合する順序を選ぶことはできません。
ただし、結合順序は完全にランダムというわけではなく、アルファベット順で若いファイル名から順番に連結されていきます。
例えば「s1.csv・a2.csv・s3.csv」の3つがあった場合は、
- a2.csv
- s1.csv
- s3.csv
の順番で連結されていきます。
「なぜ番号順じゃないのか?」と思うかもしれませんが、ファイル名の先頭文字から順番に並び替えられるため、sよりも若いaから始まるファイルが最初の結合対象となっているのです。
結合順序はコントロールしたい場合は、ファイル名に使用しているアルファベットや数字を意識するようにしましょう。
エクセル形式(.xls・.xlsxなど)は結合不可
csvが出来るから、エクセルファイル(.xls・.xlsxなど)も出来ると思うかもしれません。
ですが、エクセルで使われている.xls・.xlsx形式のファイルは、プログラムでの読み込みに特化したバイナリファイル(人間が読めないファイル)であるため、この方法では正しく結合できません。
今回はcsv・txt形式のファイルの結合について解説しているので、エクセル形式のファイルの結合については割愛させていただきます。
tsvファイルも同じ手順で結合可能
csvとは違い、タブでセル分けされるtsvファイルも同じ手順で結合することが可能です。
バッチファイルやコマンドプロンプト・Power Shellを使う場合は以下のコマンドを使用しましょう。
copy *.tsv __result.tsv
ファイルの結合に関してだけで言えば、結合対象ファイルの拡張子が変わっただけですので、やり方自体は何も変わらないのです。tsvファイルを扱うことがある場合は覚えておいてください。