我有一个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"
)
答案 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个字符将包含每个文件的完整文件路径,每个行的行号和两个冒号分隔符。