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