如何合并来自不同子文件夹的多个 CSV 文件?
How to Merge multiple CSV files from different subfolders?
我知道这是一个常见问题,但我 运行 遇到了一些错误并希望得到一些帮助。
我想将多个子文件夹中的 1000 多个 csv 文件合并到一个文件中。脚本在 MainFolder
中,应该 运行 通过子文件夹,例如01_2015
到 05_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多个文件。但是文件不会合并。怎么办?
试试这个稍微修改过的代码:
@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 文件中带有行号的行输出到摘要文件的行的开头。这避免了在摘要文件的每一行末尾附加 space。
您是否对 运行 批处理文件中设置为当前目录的目录具有写入权限?
我添加了行 PUSHD "%~dp0"
以确保批处理文件的目录在开始处理之前是当前目录,并在退出批处理之前使用 POPD
恢复以前的工作目录。
eol=ÿ
用于定义 CSV 文件中很可能不存在的字符作为行尾字符,而不是默认的 ;
。德语 CSV 文件包含 ;
作为分隔符。
字符 ÿ
在代码页 Windows-1252, i.e. is the last character in code page Windows-1252. This byte is a non breaking space in OEM code page 850. So with batch file being displayed or edited with code page 850 or OEM code page 437 中的十进制值为 255,eol=
显示在 viewer/editor 中。
如果 CSV 文件中的所有行都已经以分号开头,那么 !LINE_COUNT!
和 %%s
之间不应使用分隔符,分号也是字段值之间的分隔符。否则,分隔符(逗号、分号、竖线(转义)、制表符)应插入左侧 %%s
。
另一个问题是 CSV 文件是否是使用 UTF-16 编码的 Unicode 文件。在这种情况下,不会创建摘要文件,因为命令 FOR 从包含大量空字节的 CSV 文件中读取任何行。
我知道这是一个常见问题,但我 运行 遇到了一些错误并希望得到一些帮助。
我想将多个子文件夹中的 1000 多个 csv 文件合并到一个文件中。脚本在 MainFolder
中,应该 运行 通过子文件夹,例如01_2015
到 05_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多个文件。但是文件不会合并。怎么办?
试试这个稍微修改过的代码:
@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 文件中带有行号的行输出到摘要文件的行的开头。这避免了在摘要文件的每一行末尾附加 space。
您是否对 运行 批处理文件中设置为当前目录的目录具有写入权限?
我添加了行 PUSHD "%~dp0"
以确保批处理文件的目录在开始处理之前是当前目录,并在退出批处理之前使用 POPD
恢复以前的工作目录。
eol=ÿ
用于定义 CSV 文件中很可能不存在的字符作为行尾字符,而不是默认的 ;
。德语 CSV 文件包含 ;
作为分隔符。
字符 ÿ
在代码页 Windows-1252, i.e. is the last character in code page Windows-1252. This byte is a non breaking space in OEM code page 850. So with batch file being displayed or edited with code page 850 or OEM code page 437 中的十进制值为 255,eol=
显示在 viewer/editor 中。
如果 CSV 文件中的所有行都已经以分号开头,那么 !LINE_COUNT!
和 %%s
之间不应使用分隔符,分号也是字段值之间的分隔符。否则,分隔符(逗号、分号、竖线(转义)、制表符)应插入左侧 %%s
。
另一个问题是 CSV 文件是否是使用 UTF-16 编码的 Unicode 文件。在这种情况下,不会创建摘要文件,因为命令 FOR 从包含大量空字节的 CSV 文件中读取任何行。