Batch file 合并一系列文本文件,同时用下划线替换标题行中的空格
我正在尝试编写一个批处理文件,它将附加一系列多个CSV文件,但只保留第一个文件的头。那部分很好用。我还试图用下划线替换标题行中的空格,但无法实现这一点。有什么建议吗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
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模式。
尽管如此,这仍然不会对您有所帮助,因为该方法存在根本缺陷(在本文中,仅修改第一行并不容易) 更简单的方法是:
那么,用空格替换下划线就很简单了。
然后只需附加其余文件的内容
@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个字符。按照协议,我将发布一个关于新主题的新问题。