我有15个输入文件和一个地图,说明每个输出行应该来自哪个输入文件。输入文件看起来都一样:
1,some numbers
2,some numbers
...
2000,some numbers
地图文件看起来像
1, filename1
2, filename1
3, filename7
...
2000, filename4
我想创建一个输出文件,其中包含2000行,这些行是根据地图从输入文件复制的,即输出行1和2是从filename1复制的,第3行是从filename3,...和2000行复制的是从filename4复制的。
你能帮我弄清楚如何使用地图吗? 我认为我的代码应该像
for i = 1 to 2000
currentInputFileName = (read i-th line from the map
to figure out input file name)
findstr "%i," /b %currentInputFileName% > %outputFile%
next i
感谢您的帮助
答案 0 :(得分:1)
您的方法是正确的,但是您有一些小错误:必须从map.txt文件中的行中的第一个标记获取行数,并且文件名是第二个标记。您可以使用相同的代码,但在这种情况下,您必须从map.txt
文件中删除行号。否则,您可以从代码中删除counter
变量,并在map.txt
文件中删除数字和文件名之间的空格。
此外,你使用了一些特别慢的构造:
call
子程序很慢。最好将子程序代码放在for
中,并使用延迟扩展来获取变量。>>
很慢,因为输出文件是每次打开并关闭一行附加一行。正常>
重定向要快得多。此代码应该比原始代码运行得快得多;它使用map.txt
文件中的原始格式:1,filename1
等。
@echo off
(FOR /f "tokens=1,2 delims=," %%G IN (map.txt) DO (
findstr /b "%%G," "%%H"
)) > output.txt
答案 1 :(得分:0)
我最终写得像这样
@echo off
SET count=1
FOR /f %%G IN (map.txt) DO (call :subroutine "%%G")
GOTO :eof
:subroutine
findstr /b "%count%," %1 >> output.txt
set /a count+=1
GOTO :eof
不确定这在速度方面是否最佳。我的输入文件实际上不包含2000行,而是包含2000个块,每个块包含120行
1,1,some numbers
1,2,some numbers
...
1,120,some numbers
...
2000,120,some numbers
有没有办法编写此代码以更快地运行?