绕过Windows批处理文件中字符串的1024个字符限制

时间:2018-03-21 12:27:25

标签: batch-file

我有一个BAT文件解析出CSV文件的标题并用下划线替换空格,然后合并一系列CSV文件here。问题是,我的头文件很长,被截断为1024个字符。有没有人有建议?如果可能的话,我希望不必去PowerShell或基本批量编程之外的任何东西。

唯一的问题是标题。

@ECHO OFF
set Outputfolder=c:\Test

REM Get the header string out of one of the files
for %%I in (%outputFolder%\*_stats.csv)  do set /p HeaderString=< %%I

REM replace the spaces in that header string with underscores
SET HeaderString=%HeaderString: =_%

REM write that header as the first line of the output file
echo.%HeaderString%>%outputFolder%\all_stats_merged.csv

REM append the non-header lines from all the files
>>%outputFolder%\all_stats_merged.csv (
for %%I in (%outputFolder%\*_stats.csv)  do more +1 "%%I"
)

2 个答案:

答案 0 :(得分:2)

您的问题是您正在使用SET / P来读取标题行,标题行限制为1021个字符(不是1024个字符)。有关详情,请参阅https://www.dostips.com/forum/viewtopic.php?f=3&t=2160以及https://www.dostips.com/forum/viewtopic.php?f=3&t=2160#p12339

如果切换到可以读取~8k

的FOR / F,这很容易解决
for %%A in (%outputFolder%\*_stats.csv) do for /f "usebackq delims=" %%B in ("%%A") do (
  set "HeaderString=%%B"
  goto :break
)
:break

答案 1 :(得分:0)

尽管您倾向于远离PowerShell(如果可能),但请提供以下.ps1,看看它是否有助于更改您的偏好:

$First = $True
GCI 'C:\test\*_stats.csv' | % {$Csv = $_
    $Lines = $Lines = GC $Csv
    $Write = Switch($First) {$True {$Line = $Lines | Select -First 1
            $Line.Replace(' ','_')
            $First = $False}
        $False {$Lines | Select -Skip 1}}
    AC 'C:\test\all_stats_merged.csv' $Write}

为了完整起见,这是使用FindStr的未经测试的批处理文件尝试,最多可以包含8191个字符**:

@Echo Off
Set "OutputFolder=C:\Test"
Set "HeaderString="
For /F "Tokens=3* Delims=:" %%A In (
    'FindStr /N "^" "%OutputFolder%\*_stats.csv" 2^>Nul') Do (If "%%A"=="1" (
        If Not Defined HeaderString (Set "HeaderString=%%B"
            Call Echo %%HeaderString: =_%%)) Else Echo %%B
)>>"%OutputFolder%\all_stats_merged.csv"

上述.cmd文件的设计时%OutputFolder%包含驱动器规范;如果其最终值没有驱动器号,则您需要将Tokens=3*更改为Tokens=2*


** 但是,8191个字符将包含每个文件的完整文件路径,每个行的行号和两个冒号分隔符。