如何合并来自不同子文件夹的多个CSV文件?

时间:2015-12-08 11:25:05

标签: batch-file scripting

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

我想将多个子文件夹中的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个文件。但文件没有合并。怎么办?

1 个答案:

答案 0 :(得分:2)

试试这个稍微修改过的代码:

@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文件中读取任何行。