2017-02-02 5 views
0

Ich habe viele Textdateien. In dieser Datei interessieren mich nur wenige Zeilen. Ich dachte, dass Batch wäre effizient, um mit meinem Problem umzugehen, so verbrachte ich die letzten zwei Tage versuchen, das grundlegende dieser Sprache zu lernen. Grundsätzlich möchte ich alle meine Dateien durchsuchen (zur Vereinfachung sind sie im selben Ordner), extrahieren Sie die paar Zeilen, die ich brauche, und kopieren Sie sie in einer Zeile in einer Ausgabedatei.Extrahieren Sie einige Zeilen in mehreren Textdateien

Bisher habe ich es geschafft:

Extract alle Zeilen aus allen Dateien in einer Ausgabedatei

FOR %%f IN (*.whl) DO FOR /F "delims=|" %%l in (%%f) DO echo %%l >> output.txt 

die Linien-Extrakt (5 und 10) ich aus einer Datei möchten

(FOR /L %%i IN (1,1,5) DO SET /P line1=) < file.txt 
(FOR /L %%i IN (1,1,10) DO SET /P line2=) < file.txt 
>> output.txt ECHO %line1% %line2% 

Jetzt versuche ich, diese beiden vorherigen Code zu kombinieren:

Dieser Code gibt mir die cor rect-Ausgabe für die erste Datei, aber nicht alle Dateien durchlaufen. Wenn ich am Ende des Blocks :extract_lines einen hinzufüge, mache ich einfach die erste Datei noch einmal.

Diese Code-Schleife, aber nicht kopieren, die Zeilen, die ich in der Ausgabe wollen.

FOR %%f IN (*.whl) DO (
    (FOR /L %%i IN (1,1,5) DO SET /P line1=) < %%f 
    (FOR /L %%i IN (1,1,10) DO SET /P line2=) < %%f 

    ECHO %line1% %line2% >> output.txt 
) 

Aber wenn ich es set file=%%f Hinzufügen ändern und ersetzen < %%f durch < %file% es nicht laufen.

Übrigens habe ich this method verwendet, die gut funktionieren, aber ich frage mich, ob ich es mit der Methode, die ich bisher verwendet habe, aussortieren kann.

Vielen Dank für Ihre Hilfe!

EDIT: Wie Sie sehen können, ist dies mein erster Beitrag und auch meine ersten Schritte in dieser Sprache. Ich begrüße jeden Ratschlag, um diese Frage und vielleicht zukünftige Fragen ausführlicher zu machen, da ich möglicherweise nicht alle Informationen wahrnehme, die für einen fortgeschrittenen Benutzer relevant sind.

Dank @Magoo meine Frage ist gelöst, aber ich wäre von jedem Rat interessiert, diesen Code besser zu machen (Ich denke, es gibt einen effizienteren Weg, nur die Linie zu wählen, anstatt FOR /L zu verwenden und durch alle Linie bis zum richtigen).

Auch wenn irgendeine Person Erklärung über die verschiedenen Probleme habe, die ich beschrieben habe (z. B. < %%f anstelle von < %file%) würde am meisten begrüßt werden.

Antwort

0

Scheint wie ein XY-Problem für mich (IOW - versucht, eine Methode zu beheben, kein Problem)

(dies ist nicht getestet, da es, der Mangel an Detail gegeben sein)

FOR %%f IN (*.whl) DO (
(FOR /L %%i IN (1,1,5) DO SET /P line1=) < %%f 
(FOR /L %%i IN (1,1,10) DO SET /P line2=) < %%f 
>> output.txt CALL ECHO %%line1%% %%line2%% 
) 

sollte jede *.whl Datei finden, um den Namen zu %%f zuweisen, dann lesen Sie die ersten 5 Zeilen aus dieser Datei zu line1 und den ersten 10-line2, die fünften einer zehnten Linien in diesen beiden Variablen zu verlassen, dann die Ausgabe akkumuliert s in output.txt

IF ich Ihre Methode richtig bin Interpretation ...

+0

Tat es mein Problem lösen! Vielen Dank! Aber könnten Sie mir erklären, warum Sie "CALL ECHO" schreiben müssen? Es ist das erste Mal, dass ich es so geschrieben sehe. Auch warum 'line1' und' line2' mit zwei% ''% ''? Ich dachte, es wäre genug, um '% line1%' für eine Variable zu schreiben. Du hast Recht, das 'FOR/L' scheint nicht der beste Weg zu sein. Wäre es möglich, direkt auf die Linie zu gehen, die ich möchte? Ich habe versucht, mein Problem so detailliert wie möglich zu erklären. Welche Informationen sollte ich hinzufügen, um genauer zu sein? – bcor

+0

Das Aufruf-Echo %% var %% 'verwendet einen Parsing-Trick. Da '%%' zu '%' parst (so dass Sie ein '% '- Symbol ausgeben können), wird die Zeile als' echo% var%' interpretiert, aber mit einer Kopie der aktuellen Umgebung ausgeführt und somit der aktuelle Wert der Variable. Ohne das 'call' würde'% var% '(wörtlich) angezeigt, und' echo% var% 'würde den vakue von' var' anzeigen, wie er war, als der Block (eingeklammerte Reihe von Befehlen) zum ersten Mal eingegeben wurde. Es gibt andere Möglichkeiten, dies zu tun - was ich gezeigt habe, ist am einfachsten. Suchen Sie SO nach "delayedexpansion" für Hunderte von Artikeln in diesem FAQ. – Magoo

+0

Ich kann nichts falsches mit der 'for/L' Methode sehen, die Sie verwendet haben, um die Zeilen 5 und 10 auszuwählen. Das Glück ist, dass sie Festnetznummern sind - etwas wie" die fünfte Zeile nach dem dritten Vorkommen von ' xyzzpl' in der Datei "wäre viel schwieriger zu implementieren. – Magoo

1

Sie können möglicherweise alles in einer einzigen For Schleife mit FindStr.

@Echo Off 
>outfile.txt (For /F "Tokens=2* Delims=:" %%A In ('FindStr/N "^" *.whl' 
) Do If "%%A"=="5" (Set "_=%%B") Else If "%%A"=="10" (Call Echo=%%_%% %%B)) 
Verwandte Themen