2016-06-04 1 views
0

Ich habe 15 Eingabedateien und eine Map, die angibt, aus welcher Eingabedatei jede Ausgabezeile kommen soll. Die Eingabedateien sehen alle gleich aus:Batch zum Kopieren von spezifischem Text aus mehreren Dateien in eine Datei basierend auf einer Karte

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

Die Map-Datei sieht aus wie

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

Ich möchte eine Ausgabedatei erstellen, die von 2000 Zeilen besteht, die aus den Eingabedateien basierend auf der Karte kopiert wurden dh die Ausgabezeilen 1 und 2 wurden von Dateiname1 kopiert, Zeile 3 wurde von Dateiname3 kopiert, ... und Zeile 2000 wurde von Dateiname4 kopiert.

Können Sie mir bitte helfen, herauszufinden, wie man die Karte benutzt? Ich glaube, mein Code so etwas wie

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 

Vielen Dank für jede Hilfe, die es

Antwort

0

ich mit dem Schreiben endete sein sollte wie dieses

@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 

nicht sicher, ob dies in Bezug auf die Geschwindigkeit optimal ist. Meine Eingabedateien enthalten tatsächlich nicht 2000 Zeilen aber 2000 Blöcke, wobei jeder Block 120 Zeilen

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

Gibt es eine Möglichkeit den Code zu schreiben, schneller zu laufen?

+0

ist das wirklich, was wollen Sie? Es gibt nichts, um die Dateinamen von 'map.txt' zu bekommen. – Stephan

+0

Ich habe die map.txt-Datei so modifiziert, dass sie nur Dateinamen enthält – user6421874

1

Ihr Ansatz ist korrekt, aber Sie haben ein paar kleinere Fehler: Die Nummer der Zeile muss von das erste Token in den Zeilen in map.txt-Datei genommen werden, und der Dateiname ist das zweite Token. Sie könnten Ihren gleichen Code verwenden, aber in diesem Fall müssen Sie die Zeilennummern aus der Datei map.txt entfernen. Andernfalls können Sie die counter Variable aus dem Code und das Leerzeichen zwischen der Nummer und dem Dateinamen in map.txt Datei entfernen.

Außerdem verwenden Sie ein paar Konstrukte, die besonders langsam:

  • call Unterprogramm langsam ist. Es ist besser, den Unterprogramm-Code in for zu platzieren und verzögerte Expansion zu verwenden, um die Variablen zu erhalten.
  • Die Append-Umleitung >> ist langsam, da die Ausgabedatei geöffnet und geschlossen ist jedes Mal, dass eine Zeile an es angehängt wird. Es ist viel schneller eine normale > Umleitung.

Dieser Code sollte viel schneller als das Original laufen; verwendet es das ursprüngliche Format in map.txt Datei: 1,filename1 usw.

@echo off 

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

Wenn diese Antwort Ihnen hilft, können Sie sie als Beste Antwort auswählen, und später, wenn Sie genug Rep-Punkte haben, können Sie sie auch upvoten. So verwenden wir auf dieser Seite "Danke". – Aacini

+0

Besser, Token = 1 * 'zu verwenden, nur für den Fall, dass ein Komma im Dateinamen erscheint. – dbenham