【问题标题】:How can two text files be read in parallel by a batch file?批处理文件如何并行读取两个文本文件?
【发布时间】:2016-07-06 00:41:12
【问题描述】:

是否有一种简单且性能良好的方法可以并行读取两个(甚至更多)文本文件?所以要有一个循环,在每次迭代中读取每个文本文件的一行。

不能使用带有多个文件的for /F 循环,因为它会一个接一个地读取文件。当然,嵌套这样的循环也没有任何意义。

【问题讨论】:

    标签: windows batch-file cmd


    【解决方案1】:

    诀窍是使用 STDIN redirection <(另见this site)使用未定义的句柄(39)用于文件读取的整个代码块,块中的命令set /P 实际读取一行,0<& 将未定义的句柄重定向回set /PSTDIN,从而读取相应的行。

    这是一个如何工作的示例:

    假设有以下两个文本文件names.txt...:

    Black
    Blue
    Green
    Aqua
    Red
    Purple
    Yellow
    White
    Grey
    Brown
    

    ...和values.txt...:

    0
    1
    2
    3
    4
    5
    6
    7
    

    ...目标是将它们逐行组合以实现此文件,names=values.txt...:

    Black=0
    Blue=1
    Green=2
    Aqua=3
    Red=4
    Purple=5
    Yellow=6
    White=7
    

    ...以下代码实现了这一点(请参阅所有解释性 cmets,rem):

    @echo off
    setlocal EnableExtensions EnableDelayedExpansion
    
    rem // Define constants here:
    set "FILE1=names.txt"
    set "FILE2=values.txt"
    set "RET=names=values.txt" & rem // (none to output to console)
    if not defined RET set "RET=con"
    
    rem /* Count number of lines of 1st file (2nd file is not checked);
    rem    this is necessary to know when to stop reading: */
    for /F %%C in ('^< "%FILE1%" find /C /V ""') do set "NUM1=%%C"
    
    rem /* Here input redirection is used, each file gets its individual
    rem    (undefined) handle (that is not used by the system) which is later
    rem    redirected to handle `0`, `STDIN`, in the parenthesised block;
    rem    so the 1st file data stream is redirected to handle `4` and the
    rem    2nd file to handle `3`; within the block, as soon as a line is read
    rem    by `set /P` from a data stream, the respective handle is redirected
    rem    back to `0`, `STDIN`, where `set /P` expects its input data: */
    4< "%FILE1%" 3< "%FILE2%" > "%RET%" (
         rem // Loop through the number of lines of the 1st file:
         for /L %%I in (1,1,%NUM1%) do (
             set "LINE1=" & rem /* (clear variable to maintain empty lines;
                            rem     `set /P` does not change variable value
                            rem     in case nothing is entered/redirected) */
             rem // Change handle of 1st file back to `STDIN` and read line:
             0<&4 set /P "LINE1="
             set "LINE2=" & rem // (clear variable to maintain empty lines)
             rem // Change handle of 2nd file back to `STDIN` and read line:
             0<&3 set /P "LINE2="
             rem /* Return combined pair of lines (only if line of 2nd file is
             rem    not empty as `set /P` sets `ErrorLevel` on empty input): */
             if not ErrorLevel 1 echo(!LINE1!=!LINE2!
         )
    )
    
    endlocal
    exit /B
    

    【讨论】:

    • 是的,这个方法已经用过了here,或者here,或者here,或者here,或者here...
    • @Aacini,感谢您的链接!看来我在这里使用了错误的搜索词(parallelsimultaneousconcurrent、...); 组合文件在这里只是作为一个例子......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多