批处理文件如何并行读取两个文本文件? [英] How can two text files be read in parallel by a batch file?
问题描述
是否存在一种简单且性能良好的方式来并行读取两个(或更多)文本文件?因此,有一个循环可以在每次迭代中读取每个文本文件的一行.
Is there a simple and good-performing way to read two (or even more) text files line by line in parallel? So to have a loop that reads a single line of each text file in every iteration.
具有多个给定文件的for /F
循环不能使用,因为这会一个接一个地读取文件.嵌套这样的循环当然也没有道理.
A for /F
loop with multiple files given cannot be used as this reads a file after another. Nested such loops do not make sense either of course.
推荐答案
诀窍是使用 STDIN 此站点)针对整个代码块使用未定义的句柄(3
至9
)进行文件读取,该块中的命令set /P
实际读取一行和0<&
将未定义的句柄重定向回
The trick is to use STDIN redirection <
(see also this site) using undefined handles (3
to 9
) for the entire code block for file reading, the command set /P
in the block to actually read a line and 0<&
to redirect the undefined handles back to STDIN for set /P
, thus for the respective line to read.
以下是其工作方式示例:
Here is an example how it works:
假设存在以下两个文本文件names.txt
...:
Supposing there are the following two text files 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
...:
...and the goal is to combine them line by line to achieve this file, names=values.txt
...:
Black=0
Blue=1
Green=2
Aqua=3
Red=4
Purple=5
Yellow=6
White=7
...下面的代码完成了此操作(请参见所有解释性注释rem
):
...the following code accomplishes that (see all the explanatory comments, 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
这篇关于批处理文件如何并行读取两个文本文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!