2

将 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

这是一个测试用例。我想在更大的文件上扩展它。我也尝试了“类型”和相同的结果。

有人可以建议吗?谢谢

4

1 回答 1

3

正如 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 行。

Tab 字符会被 MORE 转换成一系列的空格字符。

如果达到 32k 行,带有重定向输出的 MORE 将暂停,等待输入。

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

(
  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

如果某些文件改用 '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
于 2014-07-25T21:48:58.483 回答