2024年9月19日木曜日

【Windowsバッチファイル】タイトル行のある複数のCSVをまとめるバッチファイル

タイトル行がある複数のCSVファイル(UTF-8)をまとめて、一つのCSVファイルにまとめるバッチファイルです。
以下コード
-------------------------------------------------------------------------
@echo off
setlocal enabledelayedexpansion
rem "CSVファイルがUTF-8の場合は65001で指定"
chcp 65001
pushd %~dp0
 
set /a first_flg=0
set FILE_NAME="result.csv"
 
for /f %%a in ('dir /b *.csv') do (
    echo %%a
    if !first_flg! == 0 (
        for /f %%b in (%%a) do echo %%b>>"!FILE_NAME!"
        set  /a first_flg=1
    ) else (
        for /f "skip=1" %%b in (%%a) do echo %%b>>"!FILE_NAME!"
    )
)
pause
endlocal
-------------------------------------------------------------------------
 
 
ネットで調べてると以下の形のコードをチラホラ見かけるんですが、
-------------------------------------------------------------------------
@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
-------------------------------------------------------------------------
これでも出来るんですけど、タイトル行が長いと途中で切れてしまったんですよね。
set /p _head=<%%i で取得する際に長さの制限がある・・・のかな?
原因は不明なんですが、とりあえずforで取得した場合は途切れなかったのでそれで必ずやるようにした感じです。
よかったら使ってみてくださいませ。

0 件のコメント:

コメントを投稿