「大量にあるCSVファイルを一つにまとめたい。
でも、各ファイルの先頭に不要なヘッダー情報(タイトルや出力条件など)が数行入っていて、
そのまま結合するとデータがガタガタになってしまう……」
そんな悩みはありませんか?Excelで一つずつ開いて行を削除し、
コピー&ペーストを繰り返すのは時間の無駄です。
Windowsの標準機能だけで動く「バッチファイル」を使えば、
フォルダ内の全ファイルを対象に、特定の行をスキップしながらスマートに結合できます。
このバッチファイルでできること
今回紹介するコードは、以下の3つの処理を自動で行います。
・先頭の余計な4行をカット:全てのCSVから、不要な最初の4行を自動で取り除きます。
・ヘッダー(見出し行)の維持:1つ目のファイルからは見出し行を維持し、2つ目以降のファイルからは見出しもカットしてデータだけを抽出します。
・ひとつのCSVに出力:全データを統合し、all.csvという名前で保存します。
仕組みの解説
このスクリプトの肝は、Windows標準のmoreコマンドを活用している点です。
通常、ファイルの結合にはtypeやcopyが使われますが、more +nというオプションを使うことで、
「先頭から $n$ 行を読み飛ばす」という高度な処理が可能になります。
・1つ目のファイル:more +4で不要な4行だけを飛ばし、5行目(見出し)から取得。
・2つ目以降:more +5で不要な4行+見出し1行の計5行を飛ばし、純粋なデータのみを末尾に追記。
このロジックにより、結合後のファイルに余計な見出しが何度も登場することなく、
そのままデータベースや分析ツールにインポートできる綺麗なCSVが完成します。
どんな時に役立つ?
私の場合、確定申告の際のカードからの引き落とし情報のCSVを1月~12月分をひとまとめにして、レシートや領収書からの手入力作業軽減のために利用しています。(セゾンカードのCSVが純粋なCSVでなく、ヘッダーの上に余分な情報が付加されているため、この余分な情報を削除するコードをバッチファイルに入れています。)
コードと使い方
下記のコードをコピーし、メモ帳やテキストエディタにペーストし、merge_csv.batなどファイル名をつけ保存します。
merge_csv.batを結合したいCSVファイルの入っているフォルダに設置し、ダブルクリックで実行。
結合されたall.csvが生成されたら完了です。
@echo off
setlocal enabledelayedexpansion
set "output=all.csv"
if exist "%output%" del "%output%"
set "first=1"
for %%f in (*.csv) do (
if /i not "%%f"=="%output%" (
echo %%f を処理中...
if !first!==1 (
rem 最初のファイル:4行飛ばして(5行目の見出しから)出力
more +4 "%%f" > "%output%"
set "first=0"
) else (
rem 2回目以降:5行飛ばして(4行+見出し1行)追記
more +5 "%%f" >> "%output%"
)
)
)
echo.
echo 最初の4行を除去し、ヘッダーを整理して %output% に結合しました。
pauseまとめ
CSVの結合は、特別なツールを使わなくても、
数行のコードで日々のルーチンワークは劇的に効率化できます。
「4行削除」の部分を「1行」や「10行」に変えるだけで、様々な形式のCSVに応用可能です。
ぜひ、日々の業務効率化に役立ててみてください!
巨大CSVを分割する方法
https://www.uki213.com/memo/split-large-csv-files-with-powershell-batch-script/