听起来您在使用*.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使用时的状态。您声明的所有变量都将被删除,并且扩展名将设置回其先前的值。