【バッチファイル】複数のCSVファイルを1つのファイルに纏める

バッチファイルで
 ・複数のCSVファイルを
 ・1つのファイルに纏める方法
を紹介します!

各CSVファイルに見出し行があっても、
上手いこと1つのファイルに纏める方法です!

コード

ここでは例として、
 ・デスクトップ配下のフォルダ「test」配下にある
 ・「対象ファイル(今回は全てCSVファイル)」を
 ・1つのファイルに纏める方法
を紹介します。

フォルダ「test」配下のCSVファイル(3つ)
フォルダ「test」配下のCSVファイル(3つ)
001.csv
001.csv
002.csv
002.csv
003.csv
003.csv

上記の全てのCSVファイルには「見出し行」があります。

@echo off

rem 遅延環境変数を使用するための宣言
setlocal enabledelayedexpansion

rem 対象フォルダ
set targetFolder=C:\Users\user\Desktop\test
rem 対象ファイル
set targetFile=*.csv
rem 出力ファイルのパス
set outputFile=C:\Users\user\Desktop\merge.csv

rem 1ファイル目かどうかを判定するためのカウンタ変数
set /a fileCount=0

rem 既に出力ファイルが存在したら削除
if exist "%outputFile%" (
    del /f "%outputFile%"
)

rem 対象ファイルの文字コードがUTF-8の場合に実行
rem chcp 65001

rem 指定フォルダ配下の全ての対象ファイルに対して処理を行う
for %%a in ("%targetFolder%\%targetFile%") do (

    rem カウンタ変数をカウントアップ
    set /a fileCount=!fileCount! + 1

    set file=%%a
    
    rem 1ファイル目のみ、(1行目を含め)まるっと出力
    rem 1ファイル目以外は、1行目を飛ばして1行ずつ出力
    if !fileCount!==1 (
        type !file! > "%outputFile%"
    ) else (
        for /f "skip=1" %%b in (!file!) do (
            set line=%%b
            echo !line!>>"%outputFile%"
        )
    )
)

rem 文字コードをUTF-8へ変更した場合、元に戻す(Shift_JISに戻す)ために実行
rem chcp 932

rem 結果確認
if %fileCount%==0 (
    echo 対象ファイル数:%fileCount%
    echo 対象ファイルが無かったため纏めませんでした。
) else (
    echo 対象ファイル数:%fileCount%
    echo 対象ファイルを1ファイルに纏めました。
)

echo.
pause
exit

「setlocal」コマンドで「遅延環境変数を使用するための宣言」をします(4行目)。
※Forコマンド内で値を更新した変数を参照できるようにするため。

「対象フォルダ」を指定します(7行目)。
「対象ファイル(今回は全てCSVファイル)」を指定します(9行目)。
「出力ファイルのパス」を指定します(11行目)。

既に「出力ファイル」が存在したら削除します(17~19行目)。

「対象ファイル(今回は全てCSVファイル)」の文字コードがUTF-8の場合は、「chcp」コマンドを実行して文字コードを適切に変更します(22、45行目)。
※上記では実行していません。コメントアウトしています。

1ファイル目のみ、(1行目を含め)まるっと出力します(35行目)。
1ファイル目以外は、1行目(見出し行)を飛ばして1行ずつ出力します(37~40行目)。

39行目の「>>」の直前に「半角スペース」を入れるのは止めてください。
不要な「半角スペース」が出力ファイルへ出力されてしまうため。

実行結果

複数のCSVファイルを1つのファイルに纏めることができました。
見出し行も上手いことできました。

実行結果①
実行結果①
実行結果②
実行結果②
実行結果③
実行結果③

参考

上記で使用した以下の詳細は、公式サイトをご確認ください。

del」コマンド


●「chcp」コマンド


「for」コマンド


「type」コマンド


「setlocal」コマンド

タイトルとURLをコピーしました