2016-04-02 16 views
2

Ich versuche, eine Spalte aus einer CSV-Datei in eine Variable zu laden. Meine CSV-Datei enthält leere Spalten so ,, haben können, welche durch die ignoriert zu werden scheint folgende:Batchdatei-Token ignorieren leere Trennzeichen

FOR /F "tokens=3 delims=," %%a in (csvfile.csv) do (
    set date=%%a 
    echo %%a 
) 

Also, wenn Datei csvfile.csv enthält

fred,wilma,tony, john, greg, wilber, blake 
chris,,steve,deon,bryan,mark,anthony 

ich das Ergebnis möchte:

tony 
steve 

Aber ich bekomme:

tony 
deon 

Wenn ich einen Leerraum in die leere Spalte einfüge, funktioniert das wie erwartet. Wie setze ich delims so, dass leere Spalten nicht ignoriert werden?

Antwort

3

for behandelt aufeinander folgende Trennzeichen als eins. In den meisten Fällen ist dies hilfreich. Manchmal ist es nicht.

So müssen Sie Ihre Zeilen in einer Weise schreiben, dass for kann so behandelt werden, wie Sie beabsichtigten.

jede Zeile der Datei als Ganzes lesen, um ein Angebot zu Beginn und am Ende hinzufügen, und jede , mit ",", was zu

"chris","","steve","deon","bryan","mark","anthony" 

Dies kann glücklich mit einem anderen for analysiert werden ersetzen. Die Tilde in %%~b entfernt die umgebenden Anführungszeichen.

@echo off 
setlocal enabledelayedexpansion 
FOR /F "tokens=*" %%a in (csvfile.csv) do (
    set line="%%a" 
    for /f "tokens=3 delims=," %%b in ("!line:,="^,"!") do echo %%~b 
) 
+0

Müssen Sie nicht zusätzliche äußere '' '', wie '(" "! Line: ^,^=", "!" ")', Da die äußeren von 'for/F verbraucht werden 'Befehl? – aschipfl

+0

@aschplfl das hat erstaunlich funktioniert (zumindest für token <> 1). Erstaunlicherweise funktioniert auch dein Vorschlag nicht. Sehen Sie meinen bearbeiteten Code. – Stephan

+0

es funktionierte für mich, ich habe es gerade erfolgreich getestet; beachte die veränderte Flucht; Wie auch immer, es scheint, dass '~' auf dem führenden '' 'beruht, aber nicht auf dem nachfolgenden; übrigens ist das' -' in 'echo - %% ~ b' ein Tippfehler, richtig? – aschipfl

0
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "filename1=%sourcedir%\q36372429.txt" 
SET "oneline=" 

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
SET "line=%%a" 
FOR /f "tokens=3delims=," %%h IN (" !line:,= , ! ") DO (
    SET "column=%%h" 
    SET "oneline=!oneline! !column:~1,-1!" 
    ECHO(!column:~1,-1! 
) 
) 
ECHO %oneline:~1% 

GOTO :EOF 

Sie würden die Einstellungen von sourcedir und filename1 ändern müssen Ihren persönlichen Umständen anzupassen.

Ich habe eine Datei mit dem Namen q36372429.txt verwendet, die Ihre Daten für meine Tests enthält.

Leider haben Sie uns keine realistische Datenprobe gezeigt. Ich bin sehr misstrauisch gegenüber Ihrer Verwendung von date als Zielvariable.

date ist eine "magische Variable" - vom System als aktuelles Datum verwaltet. Es kann außer Kraft gesetzt werden, aber es ist nicht ratsam, dies zu tun.

Es ist nicht wirklich klar, was Sie von diesem Verfahren wollen. Vielleicht möchten Sie die Einträge aus Spalte 3 alle in der Zeile, wie Sie sagen, oder vielleicht möchten Sie nur Spalte 3 auflisten oder vielleicht möchten Sie die Ausgabe in eine neue Datei übertragen.