如何修复文本文件批处理输出中的换行符?

时间:2019-06-27 05:59:43

标签: batch-file cmd

我正在尝试使用批处理合并两个文本文件数据。

这是将两个文本文件转换为单个文本文件。

我有两个文本文件,

file1.txt包含

apple

file2.txt包含

ball

我正在使用批处理脚本

type file1.txt file2.txt > output.txt

我希望output.txt中的输出是

apple
ball

但是,output.txt中的实际输出是

appleball

输出中似乎缺少换行符。

3 个答案:

答案 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一样。

但是,命令行上的许多命令不能正确显示此信息,尤其是在输出的最后一行,在这种情况下,它们经常将以下文本连接到该文本。

要解决此问题,您可以将MoreType一起使用以强制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)

您输入的文本文件似乎不会以最后的换行符终止。

以下方法仅在需要时(即,文件的最后几行不以换行符终止)插入换行符:

  1. find(将行限制为4095个字符):

    > "output.txt" (
        < "file1.txt" find /V ""
        < "file2.txt" find /V ""
    )
    
  2. typefindstr(将行限制为8190个字符):

    > "output.txt" (
        type "file1.txt" | findstr "^"
        type "file2.txt" | findstr "^"
    )
    
  3. more(将行数限制为65535个字符,将文件限制为65534行,并将 TABs 扩展为 SPACE ):

    > "output.txt" (
        more "file1.txt"
        more "file2.txt"
    )
    
  4. for /F(将行限制为8191个字符,并跳过空行):

    > "output.txt" (
        for /F usebackq^ delims^=^ eol^= %%L in ("file1.txt" "file2.txt") do @echo(%%L
    )
    
  5. for /Ffindstr(将行限制为大约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
        )
    )
    
  6. 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

可以解决您的问题。