合并一系列文本文件,同时用下划线替换标题行中的空格



我正在尝试编写一个批处理文件,该文件将附加一系列多个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"
)
)

首先,您将 HeaderString 设置为文件名,而不是标头字符串。很难简单地改变你的方法,让你在这里得到你想要的东西。
此外,您还尝试在设置它们的 if 块中使用HeaderStringHeaderString0的值。如果没有延迟扩展,这是行不通的,但这并不意味着您需要延迟扩展;这只是意味着您需要先退出 IF 块,然后才能使用这些变量的值。您可以在 IF 块中
设置值,然后关闭 IF 块,然后在第二个 IF 块中依赖它们,这为您提供了解决问题的千篇一律的模式。
不过,这仍然不会对您有所帮助,因为该方法存在根本缺陷(在这种情况下,没有简单的方法可以修改第一行)。

更简单的方法是:

  1. 获取标题行
  2. 对标题行进行空格下划线替换
  3. 将修改后的标题行添加到输出文件
  4. 将所有其他内容添加到输出文件

通过链接中提到的警告,此技巧将有效地将其中一个 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 上对此进行了测试

最新更新