我在树目录结构中设置了5000个CSV文件。 每个文件都是第一行表示其内容,然后是典型的CSV内容。
UTF-8 Key1,"Value 1", Key2,"Value 2" etc, etc...
我怎样才能快速收集每个文件的第一行,以监督他们的编码?
我试图用这个答案的帮助,但我不清楚所有的语法细微差别的batch filevariables,所以我得到的东西像Echo is on.
for /RD:\resources\ %%f in (*.csv) do ( set /p line1=<%%f echo %line1% >> out.txt )
如果零件单独执行(对于单个文件),它们工作。
我也在尝试单线
for /RD:\resources\ %f in (*.csv) do set /p line1=<%f & echo %line1% >> out.txt
但是这个从第一个文件收集的值从每个文件输出。
这里的主要问题是缺少延迟扩展 ,当你在相同的代码块中写入和读取一个变量时,这是需要的; 没有它,你正在读取解析块时出现的变量值,所以在执行之前 。 这是固定的代码:
@echo off copy NUL out.txt setlocal EnableDelayedExpansion for /R "D:\resources" %%g in ("*.csv") do ( set "line1=" < "%%~g" set /P line1="" >> "out.txt" echo(!line1! ) endlocal
此外,我引用了所有的文件/目录路径,以避免使用空格或特殊字符的麻烦。 因为echo(!line1! >> "out.txt"
也输出了>>
前面的空格 ,而不是echo
后面的空格看起来很奇怪,但是防止ECHO is {on|off}.
在!line1!
的读取行是空的时返回。
顺便说一句,你不需要准备一个空的输出文件out.txt
最初,你可以简单地将整个for
循环重定向到输出文件一旦使用>
,给你一个周围的一对括号:
@echo off setlocal EnableDelayedExpansion > "out.txt" ( for /R "D:\resources" %%g in (*.csv) do ( set "line1=" < "%%~g" set /P line1="" echo(!line1! ) ) endlocal
要直接在命令提示符下做一个单独的线程,试试这个:
cmd /V /C (for /R "D:\resources" %g in ("*.csv") do @(set "line1=" ^& ^< "%~g" set /P line1="" ^& echo(!line1!)) ^> "out.txt"
aschipfl的评论帮助。 为他人的利益添加更正和完成的脚本:
@echo off copy NUL out.txt SETLOCAL EnableDelayedExpansion for /RD:\resources\ %%g in (*.csv) do ( set /p line1=<%%g echo !line1! >> out.txt )