轮流添加2个文本文件的行

时间:2014-12-16 22:57:27

标签: batch-file

我正在尝试编写一个.bat文件,它获取3个参数--2个输入文件和一个输出文件的名称 - 并写入一个新的文件,其中input1和input2的行交替。

这可能听起来很奇怪,但我会试着举个例子:

1.txt的内容:

line 1
line 3
line 5

2.txt的内容:

line 2
line 4
line 6

运行时
> myscript.bat 1.txt 2.txt 3.txt

脚本应使用内容

创建文件3.txt
line 1
line 2
line 3
line 4
line 5
line 6
  • 在尝试解决此问题时,我遇到了一个问题,即使用for-loop token=*仅适用于单个文件,而不适用于两个文件。
  • 使用2个嵌套for循环导致1.txt的第一行和2.txt的全部内容保存在3.txt中,然后是第二行1.txt,再次是整个内容2 .txt,依此类推,直到1.txt的最后一行被追加到3.txt(后面又是2.txt的内容)。

我怎样才能实现交替线路?

问候,乔

2 个答案:

答案 0 :(得分:1)

如果你的任何一行都有感叹号,这段代码会有问题,没有一行可以超过8192个字符,如果第二个文件比第一个文件短,它只会使用尽可能多的行第一个文件在第二个文件中(如果file1.txt有5行,file2.txt有三行,脚本只从file1.txt获取前3行,输出总共有6行),但是代码工作原理:

@echo off
setlocal enabledelayedexpansion

set file1=%~1
set file2=%~2
set target_file="%~3"

:: Read in the entire first file and store it in an arraylike
set counter=-1
for /f "delims=" %%A in (%file1%) do (
    set /a counter=!counter!+1
    set file_1[!counter!]=%%A
)

:: Read in the entire second file and store it in an arraylike
set counter=-1
for /f "delims=" %%A in (%file2%) do (
    set /a counter=!counter!+1
    set file_2[!counter!]=%%A
)

:: Read one line at a time, alternating lines
type nul>%target_file%
for /L %%A in (0,1,!counter!) do (
    echo !file_1[%%A]!>>%target_file%
    echo !file_2[%%A]!>>%target_file%
)

答案 1 :(得分:0)

这是纯粹的原生批处理解决方案。

  • 文件1行限制为小于8191字节长。
  • 文件2行限制为1021字节长,并且拖尾控制字符被删除
  • 两个文件中都保留了空行和感叹号
@echo off
setlocal disableDelayedExpansion
<test2.txt >out.txt (
  for /f "delims=" %%A in ('findstr /n "^" "test1.txt"') do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    echo(!ln:*:=!
    set "ln="
    set /p "ln="
    echo(!ln!
    endlocal
  )
)

使用我的JREPL.BAT utility有一个更简单,更快速,更强大的解决方案,没有任何限制 - 一个混合的JScript /批处理脚本,可以在XP以后的任何Windows机器上运行。

JREPL.BAT旨在对文件内容进行正则表达式搜索和替换,这不是您需要的。但是,它能够从stdin和文件中读取,因此它是一种方便的方法来合并两个文件的内容而无需编写太多代码。

以下假设文件1至少与文件2一样多。

type test1.txt|jrepl "^" "" /jendln "stdout.WriteLine(stdin.ReadLine())" /f test2.txt /o out.txt

如果一个文件的行数多于另一个文件,则您尚未说明要执行的操作。如果发生这种情况,可以修改上述任何一种解决方案以满足您的需求。