我正在尝试使用批处理合并两个文本文件数据。
这是将两个文本文件转换为单个文本文件。
我有两个文本文件,
file1.txt
包含
apple
file2.txt
包含
ball
我正在使用批处理脚本
type file1.txt file2.txt > output.txt
我希望output.txt
中的输出是
apple
ball
但是,output.txt
中的实际输出是
appleball
输出中似乎缺少换行符。
答案 0 :(得分:1)
实际上是使用copy
命令在Windows中合并文件
Copy file1.txt+file2.txt output.txt
如果所需的源文本文件是源目录中的唯一文件,或者您可以使用标准cmd通配符*
或?
使用文件名轻松地仅标识所需文件的ID ,您可以一次合并无限数量的文件:
Copy File?.txt output.txt
或
Copy File*.txt output.txt
(大声笑,我丢失了原始编辑,但是,请重试)
在源文件中也可能只有换行(LF)。我相信复制应该合并这些就好了。
Windows仍然优先使用LF(CRLF)之前的回车(CR),但记事本和某些其他程序将显示LF文件,就好像它们具有CRLF一样。
但是,命令行上的许多命令不能正确显示此信息,尤其是在输出的最后一行,在这种情况下,它们经常将以下文本连接到该文本。
要解决此问题,您可以将More
与Type
一起使用以强制CRLF。
( TYPE File1.txt | MORE & TYPE File2.txt | MORE /P) > Output.txt
我有时间进行测试,最初的假设是您不能&
type
一起使用,或者不能将类型与通配符type
一起使用到more
,因此我已确认这一点,将其删除。
因此,为简化起见,您可以使用一个简单的循环,但是如asch所述,这会将您的行数限制为8个字符。
for %A IN ( "Y:\t\A\file*.txt" ) DO @( type "%A" | more /P )
使用通配符的more
会将分页放在文件之间,即使在cmd脚本中也是如此,因此尽管您可以执行与上述相同的方案,但更多的“ file * .txt”仍然存在:
for %A IN ( "Y:\t\A\file*.txt" ) DO @( More /P "%A" )
但这有其局限性。
那么,是否希望某些行长度或总行数没有这些字符限制?
好吧,如果我们可以编辑源文件,那么只需在回显末尾添加新行即可。
for %A IN ( "Y:\t\A\file*.txt" ) DO @( ECHO(>"%A" )
完成后,我们可以使用复制合并方法,该方法将没有行数或长度限制:
Copy "Y:\t\A\file*.txt" output.txt
无法编辑原始文件吗?将它们复制到临时文件以执行需要的操作,然后在完成后删除该临时目录。
MD "%Temp%\filedir"
Copy "Y:\t\A\file*.txt" "%Temp%\filedir\*"
FOR %A IN ( "%Temp%\filedir\*" ) DO @( ECHO(>"%~A" )
Copy "%Temp%\filedir\*" output.txt
RD /S /Q "%Temp%\filedir"
答案 1 :(得分:1)
您输入的文本文件似乎不会以最后的换行符终止。
以下方法仅在需要时(即,文件的最后几行不以换行符终止)插入换行符:
find
(将行限制为4095个字符):
> "output.txt" (
< "file1.txt" find /V ""
< "file2.txt" find /V ""
)
type
和findstr
(将行限制为8190个字符):
> "output.txt" (
type "file1.txt" | findstr "^"
type "file2.txt" | findstr "^"
)
more
(将行数限制为65535个字符,将文件限制为65534行,并将 TABs 扩展为 SPACE ):
> "output.txt" (
more "file1.txt"
more "file2.txt"
)
for /F
(将行限制为8191个字符,并跳过空行):
> "output.txt" (
for /F usebackq^ delims^=^ eol^= %%L in ("file1.txt" "file2.txt") do @echo(%%L
)
for /F
和findstr
(将行限制为大约8190个字符):
> "output.txt" (
for /F "delims=" %%L in ('
findstr /N "^" "file1.txt" ^& echo/^& findstr /N "^" "file2.txt"
') do @(
set "LINE=%%L"
setlocal EnableDelayedExpansion
echo(!LINE:*:=!
endlocal
)
)
set /P
(将行限制为1021个字符,并且每行只能执行一次,因为它只能读取一个字符):
setlocal EnableDelayedExpansion
for /F %%C in ('^< "file1.txt" find /C /V ""') do set "LCNT1=%%C"
for /F %%C in ('^< "file2.txt" find /C /V ""') do set "LCNT2=%%C"
> "output.txt" 9< "file1.txt" 8< "file2.txt" (
for /L %%N in (1,1,%LCNT1%) do @(
set "LINE1=" & <&9 set /P LINE1="" & echo(!LINE1!
)
for /L %%N in (1,1,%LCNT2%) do @(
set "LINE2=" & <&8 set /P LINE2="" & echo(!LINE2!
)
)
endlocal
答案 2 :(得分:0)
(type file1.txt&echo.&type file2.txt) > output.txt
可以解决您的问题。