我可能在不同时间有.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
时的状态。 您声明的任何变量都将被删除,扩展名将设置回其先前的值。