将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
这是一个测试案例。我想在更大的文件上扩展它。我也试过"输入"和相同的结果。
有人可以提出建议吗?谢谢
答案 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