将多个 CSV 文件合并为一个文件,并将其文件名添加为最后一个字段,字段名称为“文件名”

问题描述 投票:0回答:1

我想合并多个 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
    )
)
windows csv batch-file merge
1个回答
0
投票
@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
生成了文件。

© www.soinside.com 2019 - 2024. All rights reserved.