【问题标题】:Merging csv-files via batch通过批处理合并 csv 文件
【发布时间】: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 循环,但它仍然无法工作。

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

【问题讨论】:

    标签: csv batch-file merge copy


    【解决方案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 字符/字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-31
      • 2015-05-05
      • 2014-09-15
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多