【问题标题】:How to Merge multiple CSV files from different subfolders?如何合并来自不同子文件夹的多个 CSV 文件?
【发布时间】:2015-12-08 11:25:04
【问题描述】:

我知道这是一个常见问题,但我遇到了一些错误,希望能得到一些帮助。

我想将多个子文件夹中的 1000 多个 csv 文件合并到一个文件中。脚本位于MainFolder 中,应通过子文件夹运行,例如01_201505_2015 并将 csv 文件合并到 MainFolder 中的一个文件中。

我有以下文件夹结构:

-MainFolder
    -01_2015
    -02_2015
    -03_2015
    -04_2015
    -05_2015

我正在使用的脚本(来自here):

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

SET SUMMARY_FILE=sumfile.csv
IF EXIST "%SUMMARY_FILE%" (DEL "%SUMMARY_FILE%")


SET /A LINE_COUNT=1

FOR /F "usebackq tokens=*" %%f IN (`DIR /S /B *.csv`) DO (
    FOR /F "usebackq tokens=*" %%s IN ("%%~f") DO (
        ECHO !LINE_COUNT!,%%s >>"%SUMMARY_FILE%"
        SET /A LINE_COUNT=!LINE_COUNT! + 1
    )
)
EXIT /B 0

它实际上正在运行超过 1000 个文件。但是文件不会合并。怎么办?

【问题讨论】:

    标签: batch-file scripting


    【解决方案1】:

    试试这个稍加修改的代码:

    @ECHO OFF
    SETLOCAL ENABLEDELAYEDEXPANSION
    PUSHD "%~dp0"
    
    SET "SUMMARY_FILE=sumfile.csv"
    DEL /F "%SUMMARY_FILE%" 2>nul
    
    SET "LINE_COUNT=1"
    
    FOR /F "tokens=*" %%f IN ('DIR /S /B *.csv 2^>nul') DO (
        FOR /F "usebackq tokens=* eol=ÿ" %%s IN ("%%~f") DO (
            >>"%SUMMARY_FILE%" ECHO !LINE_COUNT!%%s
            SET /A LINE_COUNT+=1
        )
    )
    
    POPD
    ENDLOCAL
    

    重定向 >>"%SUMMARY_FILE%" 现在位于将当前 CSV 文件中带有行号的行输出到摘要文件中的行的开头。这样可以避免在摘要文件的每一行末尾附加一个空格。

    在运行批处理文件时设置为当前目录的目录是否具有写入权限?

    我添加了PUSHD "%~dp0"这一行,以确保批处理文件的目录在开始处理之前是当前目录,并在退出批处理之前使用POPD恢复以前的工作目录。

    eol=ÿ 用于将 CSV 文件中最可能不存在的字符定义为行尾字符,而不是默认的 ;。德语 CSV 文件包含 ; 作为分隔符。

    字符 ÿ 在代码页 Windows-1252 中具有十进制值 255,即是代码页 Windows-1252 中的最后一个字符。此字节是 OEM code page 850 中的不间断空格。因此,在使用代码页 850 或 OEM code page 437 显示或编辑批处理文件时,eol=  将显示在查看器/编辑器中。

    如果 CSV 文件中的所有行都已经以分号开头,那么 !LINE_COUNT!%%s 之间不应使用分隔符,这也是字段值之间的分隔符。否则分隔符(逗号、分号、管道(转义)、制表符)应插入到%%s 的左侧。

    如果 CSV 文件是使用 UTF-16 编码的 Unicode 文件,则会出现另一个问题。在这种情况下,不会创建摘要文件,因为命令 FOR 从包含大量空字节的 CSV 文件中读取任何行。

    【讨论】:

    • 感谢您的回答。我检查了 csv 文件的编码(它是 ANSI)。您的脚本运行良好,但再次......没有合并。我还使用来自互联网的一些随机 csv 文件对其进行了测试。事实证明,所有 csv 文件都以;(分号)开头。在excel中查看,第一整列是空的。我从我的一些文件中删除了它,现在脚本可以工作并且它们被合并了。我需要做什么才能使脚本适用于前面带有 ; 的文件(在 excel 中查看时第一列为空)?
    • 我编辑了答案,将 eol=ÿ 添加到第二个 FOR 循环并删除了 !LINE_COUNT!%%s 之间的逗号,因为看起来您的 CSV 文件使用分号作为分隔符已经出现在每行的开头。
    • 不错!谢谢@Mofi。我希望我自己知道怎么做!像魅力一样工作! :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2023-02-05
    • 2016-05-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多