簡體   English   中英

批量將特定文本從多個文件復制到基於地圖的一個文件中

[英]Batch to copy specific text from multiple files into one file based on a map

我有15個輸入文件和一個映射,該映射說明每個輸出行應來自哪個輸入文件。 輸入文件看起來都一樣:

1,some numbers
2,some numbers
...
2000,some numbers

地圖文件看起來像

1, filename1
2, filename1
3, filename7
...
2000, filename4

我想創建一個包含2000行的輸出文件,該輸出文件是根據地圖從輸入文件復制而來的,即輸出行1和2是從文件名1復制而來的,行3是從文件名3復制而來的...,行2000是從文件名復制的。文件名4。

您能幫我弄清楚如何使用地圖嗎? 我認為我的代碼應該像

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

謝謝你的幫助

您的方法是正確的,但是有一些小錯誤:行數必須取自map.txt文件中各行的第一個標記 ,文件名是第二個標記。 您可以使用相同的代碼,但是在這種情況下,必須從map.txt文件中刪除行號。 否則,您可以從代碼和map.txt文件中數字與文件名之間的空格中消除counter變量。

此外,您使用了一些特別慢的構造:

  • call子例程很慢。 最好將子例程代碼放在for並使用Delayed Expansion來獲取變量。
  • 追加重定向>>速度很慢,因為每次在其上追加一行后,輸出文件便會打開和關閉。 正常>重定向要快得多。

此代碼應比原始代碼運行得快得多; 它使用map.txt文件中的原始格式: 1,filename1等。

@echo off

(FOR /f "tokens=1,2 delims=," %%G IN (map.txt) DO (
   findstr /b "%%G," "%%H"
)) > output.txt

我最終這樣寫

@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

有沒有辦法編寫此代碼以使其運行更快?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM