我想合并多个 CSV 文件(所有文件都采用相同的格式),在一个目录中可用,并且它们的文件名应添加为最后一个字段。
由于所有 CSV 文件的字段名称都相同,因此字段名称不应重复。我想使用批处理脚本来实现这一点。
文件1示例:
C1 C2
-- --
AR1 BR1
AR2 BR2
文件2示例:
C1 C2
-- --
CR1 DR1
CR2 DR2
合并文件应该是:
C1 C2 File Name
--- --- ---------
AR1 BR1 File1
AR2 BR2 File1
CR1 DR1 File2
CR2 DR2 File2
我尝试了下面的代码,它完美地合并了文件,而不重复标题。我需要添加的是每个文件的文件名,并将其添加为合并文件中的最后一个字段。
@ECHO OFF
pushd C:\Users\Ak\Desktop\Test\New folder
SET first=y
SET newfile=Merge_CSV_HB_R5217476_REDReport.csv
for %%F in (*.csv) do IF NOT %%F==%newfile% (
if defined first (
COPY /y "%%F" %newfile% >nul
set "first="
) else (
FOR /f "skip=1delims=" %%i IN (%%F) DO >> %newfile% ECHO %%i
)
)
@ECHO OFF
SETLOCAL
rem The following settings for the directory and filenames are names
rem that I use for testing and deliberately includes spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:\your files"
pushd %sourcedir%
SET "fffl=y"
SET "newfile=Merge_CSV_HB_R5217476_REDReport.csv"
(
for %%e in (*.csv) do IF NOT "%%e"=="%newfile%" (
SET "first=y"
FOR /f "usebackq delims=" %%y IN ("%%e") DO (
IF DEFINED fffl (
ECHO %%y File Name
) ELSE (
if NOT defined first ECHO %%y %%~ne
)
SET "fffl="
SET "first="
)
)
)>"%newfile%"
TYPE "%newfile%"
POPD
GOTO :EOF
原始代码的工作原理是使用
first
标志来检测第一个 .csv
文件,直接复制该文件,然后附加其余文件,所有文件都在第一行之外。
问题要求处理每个文件的every行,因此
skip
方法不可用。
因此,我们需要检测第一个文件的第一行 (
fffl
),因为该行需要特殊处理 - 添加额外的列名称和每个文件的非第一行(不是 first
,其中 first
当选择新文件进行处理时会重新初始化)以添加文件名。
所以 - 假设源数据中没有出现下划线,我们可以简单地使用
fffl
和first
作为布尔值来选择需要反省和补充的数据。
请注意全文使用引号,以允许文件/目录名称包含空格等分隔符,并使用修饰符
~n
仅选择正在处理的文件的名称部分,并且一般原则是引用-set方法更加稳健。
此外,我还更改了元变量名称,以便它们不再是元变量修饰符。
请注意,整个
for
语句由 (
...)>"filename"
括起来。这会创建一个带有数据累积的新文件 echo
ed,减少由 append 方法生成的文件打开-关闭次数。
当然,我已经关闭了
pushd/popd
括号,其中 type
生成了文件。