0

我可能在不同时间有需要合并的 .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 个条目长,但随着时间的推移,它们可能有数千个或更多。

4

1 回答 1

2

听起来您在使用*.csv输出并将输出重定向到.csv同一文件夹中的文件时遇到问题。DOS 似乎正在查找该my-new-file.csv文件,*.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使用时的状态。您声明的所有变量都将被删除,并且扩展名将设置回其先前的值。

于 2013-02-04T22:28:50.343 回答