ファイル結合 - バッチファイル

複数のファイルに分かれたデータをさくっと1ファイルにまとめたいとき。

同階層のCSVのみresult.csvに結合

@echo off
 
for /f %%i in ('dir /b *.csv') do (
    echo %%i
    type %%i>>result.csv
)
pause

最初のファイルのみ1行目を出力

そろってヘッダが付いてる場合など

複数のcsvファイルを結合するバッチ(1個目のファイル以外は1行目を削除) - Qiita

@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
    )
)
pause

同階層のサブディレクトリを含む全てのCSVを結合

@echo off
 
for /f %%i in ('dir /b /s *.csv') do (
    echo %%i
    type %%i>>result.csv
)
pause

上手くいかない場合

以下を試す。

  • ファイルパスを英数字のみの箇所にする
  • ファイルの文字コードをCP932(SJIS)にする

ファイルの中身がUTF-8の場合、バッチファイルの最初に chcp 65001 など文字コード指定を付ければ基本は行けると思う。
だが、バッチファイルはSJIS以外の取り回しで変な挙動が多い。

たとえば「最初のファイルのみ1行目を出力」で、ファイルがUTF-8で、最初の1行の末尾文字が日本語文字だった場合、最初の1行を読み込むところで何故か2行目まで含めて読み込まれてしまう。

file1.csv    file2.csv    file3.csv

あ,い,う     あ,い,う     あ,い,う
1,2,3        4,5,6        7,8,9

↓
result.csv

あ,い,う
1,2,3
1,2,3
4,5,6
7,8,9

だが「う」を「う1」にするなど半角文字を付ければ上手くいったりする。
その辺上手く書く方法があるのかも知れないが、このような罠がバッチファイルは結構あるので、なるべくSJISで扱いたい。

またはPowerShellでやると上手くいくかも?

programming/batch/concatenate.txt · 最終更新: 2021/09/01 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0