我正在尝试编写一个批处理文件,该文件会附加一系列多个CSV文件,但只会传输第一个文件的标题。那部分工作正常。我也试图用下划线替换标题行中的空格,但不能使它工作。有什么建议吗?
SET Outputfolder=c:\Test
REM Merge all CSVs containing statistics to one and remove spaces in the header
SET first=1
>%OUTPUTfolder%\all_stats_merged.csv (
FOR %%I in (%OUTPUTfolder%\*_stats.csv) DO (
IF defined first (
SET HeaderString0=%%I
SET HeaderString=%HeaderString0: =_%
TYPE "%HeaderString%"
SET "first="
) else more +1 "%%I"
)
)
答案 0 :(得分:1)
首先,您将HeaderString设置为文件名,而不是标题字符串。很难轻易改变你的方法来获得你想要的东西。
您还试图在他们设置的IF块中使用HeaderString
和HeaderString0
的值。如果没有延迟扩张,这将无法运作,但这并不意味着您需要延迟扩张;它只是意味着您需要退出IF块才能使用这些变量的值
您可以在IF块中设置值,然后关闭IF块,然后在第二个IF块中依赖它们,这为您提供了解决该问题的切割模式。
但是这仍然无法帮助你,因为这种方法存在根本缺陷(在这种情况下,没有简单的方法可以修改第一行)。
更简单的方法是:
通过链接中提到的警告,this trick将有效地将其中一个csv文件的第一行(标题行)转换为变量。
然后,我们可以轻松地替换下划线
然后只需附加其余文件的内容。
@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"
)
我在Windows 7和8.1上测试了这个