我在树目录结构中设置了5000个CSV文件。
每个文件的第一行表示其内容,然后是典型的CSV内容。

UTF-8
Key1,"Value 1",
Key2,"Value 2"
etc, etc...

我如何快速从每个文件收集第一行以监视其编码集?

我正在this answer的帮助下尝试此操作,但我不太清楚批处理文件变量的所有语法细微差别,因此我遇到了类似Echo is on.的问题
for /R D:\resources\ %%f in (*.csv) do (
    set /p line1=<%%f
    echo %line1% >> out.txt
)

如果零件单独执行(对于单个文件),则它们可以工作。

我也在尝试单线
for /R D:\resources\ %f in (*.csv) do set /p line1=<%f & echo %line1% >> out.txt

但这会将从第一个文件收集的值放入每个文件的输出中。

最佳答案

这里的主要问题是缺少delayed expansion,当您在同一代码块中写入和读取变量时需要使用redirection syntax。没有它,您将在解析块时读取存在的变量值,因此在执行该变量之前。这是固定代码:

@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

另外,我引用了所有文件/目录路径,以避免出现空格或特殊字符的麻烦。我还反转了ojit_a,因为echo(!line1! >> "out.txt"还在>>前面输出了SPACE。 (后面的空格不是空格,而是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"

关于windows - 从目录子树中的每个文本文件中提取第一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44354247/

10-11 22:57
查看更多