批量将基于地图的多个文件中的特定文本复制到一个文件中

时间:2016-06-04 04:07:48

标签: batch-file

我有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

感谢您的帮助

2 个答案:

答案 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

有没有办法编写此代码以更快地运行?