在窗口中合并 CSV 文件(最好是 .cmd 或.bat文件)



我可能在不同时间有.csv文件需要合并。它们具有相同的标题和列布局。我只需要一种简单的方法来将它们组合在Windows 7中。用户可能并不总是安装了 excel。

.cmd 宏会很棒,但我在网上找到的宏不起作用。

到目前为止,我得到的最好的是:

"打开命令窗口("cmd.exe")并键入以下两行(无括号)

cd "Desktop[csv-files]"
type *.csv > my-new-file.csv"
Where the files to be combined are in Desktop[csv-files].

但是 - 它似乎创建了组合条目的副本(或在某些情况下一式三份)。例如,我测试了 2 个文件,分别包含 23 个和 26 个唯一条目。我拿出了一个包含 100 个条目的文件,并且至少有一个条目重复了 3 次。

现在我正在测试的.csv文件只有~25个条目长,但随着时间的推移,它们可能会有数千个或更多。

听起来您在使用 *.csv 并将输出重定向到同一文件夹中的.csv文件时遇到问题。 DOS似乎因为*.csv而找到了my-new-file.csv文件,并将其输入到自身中...... 您可以使用不同的输出文件扩展名,直到 type 命令完成后,然后您可以重命名输出文件... 像这样:

cd "Desktop[csv-files]"
type *.csv > my-new-file.txt
ren my-new-file.txt my-new-file.csv

您还可以在第一个文件之后跳过每个文件的标头,这样您就不会在输出文件的中间出现文件标头。 请尝试以下操作:

@echo off
setlocal ENABLEDELAYEDEXPANSION
set cnt=1
cd "Desktop[csv-files]"
for %%i in (*.csv) do (
  if !cnt!==1 (
    for /f "delims=" %%j in ('type "%%i"') do echo %%j >> my-new-file.txt
  ) else (
    for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> my-new-file.txt
  )
  set /a cnt+=1
)
endlocal
ren my-new-file.txt my-new-file.csv

解释:

我使用ENABLEDELAYEDEXPANSION来确保正确计算cnt变量。 启用延迟扩展后,您可以使用!来区分变量,而不是%。 因此,要评估cnt变量,请使用 !cnt! 而不是 %cnt% 。 延迟扩展会使其等待评估cnt的值,直到使用它的那一刻。 有时,但并非总是如此,如果您使用 %cnt% ,它将等于上一次迭代的值。 如果启用延迟扩展并使用 !cnt! ,它将始终计算正确的电流值。

通过将cnt设置为 1 ,我们可以为处理的第一个.csv文件运行不同的代码。 该代码包括第一个.csv文件中的所有行,但跳过所有后续.csv文件的第一行。

我使用了嵌套for循环。 外部for循环访问当前文件夹中的所有.csv文件。 内部 for 循环执行 type "%%i" 命令,其中%%i.csv文件的名称。 文件的每一行都作为%%j单独处理,并传递给echo %%j命令。 echo通常会将%%j的值打印到命令提示符窗口。 但是,您可以使用 >>> 将输出重定向到文件。 >重定向程序使用新值覆盖输出文件。 >>重定向程序将新值追加到输出文件。 由于每个文件的每一行以及每个文件都是单独处理的,因此我们必须使用 >> 重定向器将所有内容推送到单个文件中。

使用 for /f 命令时,输出将使用指定的分隔符分解为各个部分。 默认分隔符是空格。 如果我不包括"delims=",那么文本This is fun将分为以下内容:

%%j = This
%%k = is
%%l = fun

我们希望一次处理.csv文件中的整行。 通过将分隔符设置为无("delims="),可以使用%%j处理整行。

有关 for 命令工作原理的更具体帮助,请在命令提示符处键入 for /?

endlocal将环境恢复到使用setlocal时的状态。 您声明的任何变量都将被删除,扩展名将设置回其先前的值。

最新更新