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

Batch file 合并一系列文本文件,同时用下划线替换标题行中的空格,batch-file,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

我正在尝试编写一个批处理文件,它将附加一系列多个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块中使用
HeaderString
HeaderString0
的值。如果没有延迟扩张,这是行不通的,但这并不意味着你需要延迟扩张;这只意味着您需要先退出IF块,然后才能使用这些变量的值。
您可以在IF块中设置值,然后关闭IF块,然后在第二个IF块中依赖这些值,这将为您提供一个解决该问题的cookie-cutter模式。
尽管如此,这仍然不会对您有所帮助,因为该方法存在根本缺陷(在本文中,仅修改第一行并不容易)

更简单的方法是:

  • 获取标题行
  • 是否用下划线替换标题行中的空格
  • 将修改后的标题行添加到输出文件中
  • 将所有其他内容添加到输出文件中
  • 通过链接中提到的注意事项,将有效地将其中一个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"
    )
    
    @ECHO关闭
    设置Outputfolder=c:\Test
    REM从其中一个文件中获取头字符串
    对于(%outputFolder%\*\u stats.csv)中的%%I,请设置/p标题字符串=<%I
    REM将标题字符串中的空格替换为下划线
    设置HeaderString=%HeaderString:=\uU%
    REM将该头写入输出文件的第一行
    回显。%HeaderString%>%outputFolder%\all\u stats\u merged.csv
    REM追加所有文件中的非标题行
    >>%outputFolder%\all\u stats\u merged.csv(
    对于(%outputFolder%\*\u stats.csv)中的%%I,请执行更多操作+1“%%I”
    )
    

    我在Windows 7和8.1上测试了这一点,您需要启用延迟扩展,或者完全避免使用多行代码块
    do call:Something
    而不是
    do(这里有多行)
    。如何避免多行代码块?我不需要外部的“for”循环和内部的“if”语句来只保留第一个数据集的头吗?如果有一种方法可以简化代码,我当然很乐意探索它。您可以先将头字符串放入
    HeaderString
    中,而不是将文件名放入其中。如果文件的行数超过65536行,则代码将失败。“更多”命令有一个限制。此解决方案有效,但暴露了一个新问题。我的标题字符串很长,被截断为1024个字符。按照协议,我将发布一个关于新主题的新问题。