bat文件提取csv文件的头文件

时间:2016-10-12 15:08:36

标签: csv batch-file

我需要一些帮助和指导。 我有下面的脚本,在文件夹中查找csv文件。将文件的文件名和标头抓取到输出文件。

脚本可以正常工作,但是标题会在输出文件的行尾被切断。如何将整个标题传递给输出文件?

@ECHO OFF &SETLOCAL
for %%a in (*.csv) do (
set "line="
set /p "line="<"%%~a"
SETLOCAL ENABLEDELAYEDEXPANSION
echo %%a %line%":">>output.txt
echo(!line!>> output.txt 
endlocal
)

1 个答案:

答案 0 :(得分:2)

这取决于你的csv标头的长度。

在您的代码中,您正在使用重定向输入和set /p读取标头。此方法允许最大输入1022个字符。

您可以使用for /f来读取文件,但这也仅限于最大命令行长度,在本例中为8192个字符。

@echo off
    setlocal enableextensions disabledelayedexpansion

    (for /f "tokens=1,2,* delims=:" %%a in ('
        findstr /n "^" *.csv ^| findstr /b "[^:]*:1:"
    ') do (
        echo(%%a:
        echo(    %%c
    )) > output.txt

此代码只是使用findstr命令读取输入文件,计算输出行,并从此输出中仅检索每个文件的第一行。 for /f使用冒号分割行以检索行中的前三个标记:文件名,行号和行内容。

已修改以适应评论

如上所述,存在一个限制,实际数据与之相撞。

我没有看到防弹纯批处理解决方案,但混合文件可以解决问题

@if (@This==@IsBatch) @then
@echo off
    setlocal enableextensions disabledelayedexpansion

    call :getBatchFileReference _f0

    (
        for %%a in (*.csv) do (
            echo %%a
            <"%%a" cscript //nologo //e:Jscript "%_f0%"
        )
    ) > output.txt

    goto :eof

:getBatchFileReference returnVar
    set "%~1=%~f0"
    goto :eof

@end
    WScript.StdOut.WriteLine(WScript.StdIn.ReadLine());

保存为.cmd.bat,该文件包含带有批处理代码的初始区域和带有javascript代码的最终区域。

对于每个csv文件,批处理部件会将其作为输入重定向到javascript部分以读取第一行并输出它。