2010-12-16 19 views
3

Wenn eine Liste von kommagetrennten Werten wie 3, asdf, *#, 1212.3 angegeben wird, möchte ich jeden dieser Werte ohne das Komma extrahieren, also hätte ich eine Werteliste wie [3, "asdf", "*#", 1212.3] (nicht als Textdarstellung) so, aber als eine Reihe von "Hits"). Wie würde ich das tun?Extrahieren von Werten aus kommagetrennten Listen

+1

In welcher Programmiersprache? – Asaph

+1

Die D-Programmiersprache. –

Antwort

2

Zunächst, wenn Sie mit CSV-Dateien beschäftigen, verwenden Sie nicht Regex oder Ihren eigenen Parser. Grundsätzlich, wenn Sie denken, Dinge sind einfach, sie sind wirklich nicht, Stop Rolling Your Own CSV Parser.

Als nächstes sagen Sie, dass Sie ein Array haben möchten ([3, "asdf", "* #", 1212.3]). Dies scheint Mischtypen zu sein und kann nicht in einer statischen Sprache erfolgen. Und letztlich ist sehr ineffizient, selbst mit std.variant. Für jeden analysierten Wert müssten Sie Code wie:

try { 
    auto data = to!double(parsedValue); 
    auto data2 = to!int(data); 
    if(data == data2) 
     returnThis = Variant(data2); 
    else 
     returnThis = Variant(data); 
} catch(ConvException ce) { } 

Nun, wenn Sie Ihre Daten wirklich durch eine definierte Menge von Zeichen getrennt ist, und wird nicht in Aufzeichnungen mit neuen Linien gebrochen, dann können Sie Split verwenden (“ , ") von std.algorithmus. Andernfalls verwenden Sie einen CSV-Parser. Wenn Sie nicht dem Standard-Wrapper des Parsers folgen möchten, sind die Daten das, was Sie wünschen. In Ihrem Beispiel haben Sie Leerzeichen, die nicht vom CSV-Format ignoriert werden sollen, also rufen Sie strip() auf der Ausgabe auf.

In the article I linked es erwähnt, dass was häufig passiert ist, dass Leute einen Parser in seiner einfachsten Form schreiben und nicht die komplizierteren Fälle behandeln. Wenn Sie also nach einem CSV-Parser suchen, werden Sie viele finden, die ihn nicht schneiden. Das Schreiben eines eigenen Parsers kommt auf, was meiner Meinung nach in Ordnung ist, behandeln Sie nur alle gültigen CSV-Dateien.

Glücklicherweise müssen Sie nicht Ihre eigenen schreiben, wie ich eine CSV Parser for D vorbereitete. Die Fehlerüberprüfung wird derzeit nicht durchgeführt. Ich weiß nicht, wie Probleme am besten gemeldet werden, sodass die Analyse korrigiert und fortgesetzt werden kann. Anwendungsbeispiele finden Sie in den Unittest-Blöcken. Sie können auch eine Struktur analysieren:

struct MyData { 
    int a; 
    string b; 
    string c; 
    double d 
} 

foreach(data; csv.csv!MyData(str)) // I think I'll need to change the module/function name 
    //... 
1

in perl könnten Sie so etwas wie:

@anArray = split(',', "A,B,C,D,E,F,G"); 
+0

Was passiert, wenn einige der CSV-Felder Kommas haben? z.B. "Mein erstes Feld", "mein zweites Feld", "mein drittes Feld", was in CSV völlig legal ist. – Asaph

+0

Trotzdem verwendet das OP die Programmiersprache D. Also eine Perl-Antwort ist nicht relevant. – Asaph

+0

@Assaph tut mir leid für meinen Vorschlag, es scheint, ich habe meine Post gemacht, als die Klarstellung bezüglich der D-Sprache gemacht worden war. In jedem Fall, wenn Kommas innerhalb des Feldes existieren, würde ich mir vorstellen, dass jeder CSV-Parser Probleme haben würde, wenn nicht jedes Feld in Anführungszeichen eingeschlossen wäre. In diesem Fall müssten Sie beim Analysieren Anführungszeichen zählen. – Bnjmn

5

Ich sehe, dass Sie mit der Programmiersprache D. Hier ist ein Link zu einem CSV parser for D.

+0

Sorry für nicht so viel in der Art von Kommentaren. Aber die unitest Abschnitte sollten gute Beispiele geben, wie es verwendet wird. Auch das ist wahrscheinlich eine bessere URL: https://github.com/he-the-great/JPDLibs/tree/csv –

+0

@he_the_great: Ich habe den Link zu dem neuen, den du vorgeschlagen hast, aktualisiert. Vielen Dank. – Asaph

0

(?:,|\s+)?([^ ,]+) sollte tun. Es überspringt ein Komma oder Leerzeichen und wählt dann alles außer einem Komma oder Leerzeichen aus. Ändern Sie nach Geschmack.

+0

Dies ist selbst für das einfache CSV-Format zu einfach. Siehe Kommentare in @ Bnjmn für Details. – Asaph

Verwandte Themen