将2个文件批量合并到一个文件时出现问题

时间:2014-07-24 21:19:18

标签: batch-file copy append filemerge

将2个文件合并到一个文件时出现问题。第一个文件包含行1 2 3 4,第二个文件包含行5 6 7。

当我这样做时:copy test1.txt+test2.txt result.txt我得到以下几行。请注意4接近5。

1
2
3
45
6
7

我不知道为什么,我希望5 6 7继续从新的一行开始:

1
2
3
4
5
6
7

这是一个测试案例。我想在更大的文件上扩展它。我也试过"输入"和相同的结果。

有人可以提出建议吗?谢谢

1 个答案:

答案 0 :(得分:2)

正如Mofi的评论所述,test1.txt的最后一行并不以换行符结尾。 COPY和TYPE都没有在文件末尾添加换行符,因此test1的结尾会运行到test2的开头。

在您的评论中,您声明使用以下方法解决了问题:

for %%x in (test*.txt) do more "%%x" >>new.txt

使用以下方法可以提高效率:

(for %%x in (test*.txt) do more "%%x") >new.txt

无论哪种方式,只要内容不包含制表符,上述工作正常,并且没有源文件超过32k行。

制表符将由MORE转换为一系列空格字符。

对于重定向输出的更多内容将暂停,等待输入,如果它达到32k行。

如果出现上述任何一个问题,那么您可以执行以下操作:

(
  for %%x in (test*.txt) do (
    type "%%x"
    echo(
  )
) >new.txt

这将始终在每个文件之间插入换行符。但如果文件的最后一行已包含换行符,则可能会出现问题。在这种情况下,你最终会得到

1
2
3
4

5
6
7

完美的解决方案要求您检测文件的最后一行何时未以换行符终止。

如果您知道所有文件都使用Windows样式换行符(回车符/换行符),则以下情况有效。 FINDSTR标识不包含回车符的行。

(
  for %%x in (test*.txt) do (
    type "%%x"
    findstr /v $ "%%x" >nul && echo(
  )
) >new.txt

如果某些文件使用&#n; nix样式(仅限换行符),那么解决方案会更复杂一些。此FINDSTR标识不包含换行符的行。

setlocal enableDelayedExpansion
:: define LF to contain a line feed character (0x0A)
set ^"LF=

^" The empty line above is critical - DO NOT REMOVE
(
  for %%x in (test*.txt) do (
    type "%%x"
    findstr /v "!lf!." >nul && echo(
  )
) >new.txt