2017-06-04 3 views
2

Ich habe 5000 CSV-Dateien in Baumverzeichnisstruktur festgelegt. Jede Datei war die erste Zeile, die die Übergabe anzeigte, dann folgte der typische CSV-Inhalt.Extrahiere die erste Zeile aus jeder Textdatei im Verzeichnis Teilbaum

Wie kann ich schnell die erste Zeile aus jeder Datei sammeln, um den Satz ihrer Kodierungen zu überwachen?

Ich versuche, dies mit Hilfe von this answer aber ich verstehe nicht eindeutig alle Syntax Nuancen der Batch-Datei Variablen so dass ich Sachen bin immer wie Echo is on.

for /R D:\resources\ %%f in (*.csv) do (
    set /p line1=<%%f 
    echo %line1% >> out.txt 
) 

Wenn Teile einzeln ausgeführt werden (für einzelne Datei), Sie arbeiten.

Ich war auch Single-Liner

for /R D:\resources\ %f in (*.csv) do set /p line1=<%f & echo %line1% >> out.txt 

aber diesen einen Put-Wert versuchen, aus der ersten Datei in Ausgabe von jeder Datei gesammelt.

+1

Sie erhalten 'Echo ist on.' weil '% line1%' leer erscheint. Aktivieren Sie [verzögerte Erweiterung] (http://ss64.com/nt/delayedexpansion.html), während Sie * schreiben und * die Variable im selben Codeblock lesen. Schließlich, ändern Sie Ihre 'echo' Befehlszeile zu' >> out.txt echo (! Line1! '. – aschipfl

+1

@ aschipl - das half. Möchten Sie es als Antwort hinzufügen? Ich werde es akzeptieren. – miroxlav

Antwort

2

Das Hauptproblem hier ist der Mangel an delayed expansion, die benötigt wird, wenn Sie schreiben und lesen eine Variable innerhalb der gleichen Code-Block; Ohne sie lesen Sie den Variablenwert, der beim Analysieren des Blocks vorhanden ist, also wird vor ausgeführt. Hier ist der feste Code:

@echo off 
copy NUL out.txt 
setlocal EnableDelayedExpansion 
for /R "D:\resources" %%g in ("*.csv") do (
    set "line1=" 
    < "%%~g" set /P line1="" 
    >> "out.txt" echo(!line1! 
) 
endlocal 

Außerdem zitierte ich alle Datei-/Verzeichnispfade, um in ihnen Probleme mit weiß-Leerzeichen oder Sonderzeichen zu vermeiden. Ich habe auch die redirection syntax umgekehrt, weil echo(!line1! >> "out.txt" auch die SPACE vor >> ausgibt. Die ( statt SPACE hinter echo sieht ungerade aber verhindert ECHO is {on|off}. zurückgegeben wird, wenn die Leseleitung in !line1! leer ist.

By the way, brauchen Sie nicht eine leere Ausgabedatei out.txt zunächst vorzubereiten, können Sie einfach die ganze for Schleife in die Ausgabedateien umleiten einmal > verwenden, da Sie eine umgebende Paar Klammern gesetzt:

@echo off 
setlocal EnableDelayedExpansion 
> "out.txt" (
    for /R "D:\resources" %%g in (*.csv) do (
     set "line1=" 
     < "%%~g" set /P line1="" 
     echo(!line1! 
    ) 
) 
endlocal 

gleich direkt in Eingabeaufforderung als Single-Liner zu tun, versuchen Sie dies:

cmd /V /C (for /R "D:\resources" %g in ("*.csv") do @(set "line1=" ^& ^< "%~g" set /P line1="" ^& echo(!line1!)) ^> "out.txt" 
+0

Man ... Das ist eine sehr qualifizierte Antwort, und so werden Skriptdateien, die von Tricks der Profis gepackt werden, für Freizeit-Scripter schwer lesbar. :) Ich habe dieses Q/A mit einem Lesezeichen versehen, um das nächste Mal zu diesen Techniken zurückzukehren.Danke für die Optimierung und ihre Erklärung. – miroxlav

0

aschipfl's comment geholfen. Skript zum Nutzen anderer korrigiert und ergänzt ergänzt:

@echo off 
copy NUL out.txt 
SETLOCAL EnableDelayedExpansion 
for /R D:\resources\ %%g in (*.csv) do (
    set /p line1=<%%g 
    echo !line1! >> out.txt 
) 
Verwandte Themen