通过批处理合并 csv 文件

Posted

技术标签:

【中文标题】通过批处理合并 csv 文件【英文标题】:Merging csv-files via batch 【发布时间】:2020-05-08 14:23:06 【问题描述】:

我需要将很多来自不同来源的小 csv 文件合并到单独的更大的 csv 文件中

我通常使用:

for /r E:\MyFolder %%d in (.) do ( 
    copy "%%d\*.csv" "%%d\merge.txt" /B
)

这可以正常工作,但对于某种类型的 csv 文件,最后缺少一个新行,这将无法正常工作。 我可以使用:

for %%x in (E:\MyFolder\case1\*.csv) do more "%%x" >>E:\MyFolder\case1\merge.txt

但显然它不会递归运行,只针对顶层文件夹。我尝试包装与围绕它的其他语句中相同的 for 循环,但它仍然无法工作。

你能帮我让它递归地工作吗?

【问题讨论】:

【参考方案1】:

以下代码应该适合您:

@echo off
rem // Define constants here:
set "_ROOT=E:\MyFolder"
set "_FILE=merge.csv"
set "_MASK=*.csv"
rem // Resolve target file path for later comparison:
for %%C in ("%_ROOT%\%_FILE%") do (
    rem // Write to target file:
    > "%%~fC" (
        rem // Change into parent directory of target file:
        pushd "%%~dpC." && (
            rem // Loop through all matching files:
            for /R %%F in ("%_MASK%") do (
                rem // Exclude target file:
                if /I not "%%~F"=="%%~fC" (
                    rem // Return file content with final line-break if needed:
                    more "%%~F"
                )
            )
            popd
        )
    )
)

当输入 CSV 文件包含少于 64K 行/行且每行短于 64K 字符/字节时,此方法有效。

对于具有 64K 行/行或更多行的输入 CSV 文件,将 more "%%~F" 替换为 < "%%~F" find /V "",因为每个行/行都短于 4K 字符/字节。

【讨论】:

以上是关于通过批处理合并 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 文件与批处理文件合并,包括每行中的文件名

我的批处理文件应该有啥代码将多个 CSV 文件合并到一个新的单个 Excel 工作簿中,但每个 CSV 文件都有自己的工作表?

Ruby 在处理大文件时搜索和合并 CSV 文件

Spring Batch中如何读取多个CSV文件合并数据进行处理?

powershell合并csv

使用 PowerShell 将多个 CSV 文件合并为一个