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

时间:2018-03-20 21:36:59

标签: batch-file

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

1 个答案:

答案 0 :(得分:1)

首先,您将HeaderString设置为文件名,而不是标题字符串。很难轻易改变你的方法来获得你想要的东西。
您还试图在他们设置的IF块中使用HeaderStringHeaderString0的值。如果没有延迟扩张,这将无法运作,但这并不意味着您需要延迟扩张;它只是意味着您需要退出IF块才能使用这些变量的值 您可以在IF块中设置值,然后关闭IF块,然后在第二个IF块中依赖它们,这为您提供了解决该问题的切割模式。
但是这仍然无法帮助你,因为这种方法存在根本缺陷(在这种情况下,没有简单的方法可以修改第一行)。

更简单的方法是:

  1. 获取标题行
  2. 用标题行替换空格“
  3. 将修改后的标题行添加到输出文件
  4. 将所有其他内容添加到您的输出文件
  5. 通过链接中提到的警告,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上测试了这个