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
Antwort
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
//...
in perl könnten Sie so etwas wie:
@anArray = split(',', "A,B,C,D,E,F,G");
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
Trotzdem verwendet das OP die Programmiersprache D. Also eine Perl-Antwort ist nicht relevant. – Asaph
@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
Ich sehe, dass Sie mit der Programmiersprache D. Hier ist ein Link zu einem CSV parser for D.
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 –
@he_the_great: Ich habe den Link zu dem neuen, den du vorgeschlagen hast, aktualisiert. Vielen Dank. – Asaph
(?:,|\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.
Dies ist selbst für das einfache CSV-Format zu einfach. Siehe Kommentare in @ Bnjmn für Details. – Asaph
- 1. Einfügen von geteilten Werten aus kommagetrennten Listen
- 2. Wert aus kommagetrennten Werten entfernen string
- 3. Extrahieren von Werten aus Array von Arrays
- 4. MongoDB Extrahieren von Werten aus BasicDBObject (Java)
- 5. vb.net Füllen Combobox mit kommagetrennten Werten aus einer INI-Datei
- 6. Regex ersetzen einen Wert zwischen kommagetrennten Werten
- 7. Unique-Werte aus mehreren Listen extrahieren
- 8. Suche mit kommagetrennten Werten im Elasticsearch
- 9. lesen Datei mit kommagetrennten Werten im c
- 10. Extrahieren von Werten aus einem Array von Deferreds
- 11. Konvertieren von kommagetrennten Werten in die Liste <Long>
- 12. Regex für Bereiche von Werten in kommagetrennten Liste
- 13. Extrahieren eines Elements aus einer Liste von Listen?
- 14. Alle Kombinationen von Werten aus vielen Listen erhalten
- 15. Extrahieren von Werten aus IRanges-Objekten in R/Bioconductor
- 16. bessere Möglichkeit zum Extrahieren von Werten aus Zeichenfolge
- 17. Extrahieren von dynamischen Werten aus JSON mit Freemarker
- 18. Extrahieren von Werten aus einer Zeichenfolge mit grep und awk
- 19. Extrahieren von Werten aus AnyObject Dictionary in Array
- 20. Extrahieren von Werten aus einer Funktionsausgang: In R
- 21. Eine Teilmenge von Werten aus einem assoziativen Array (PHP) extrahieren
- 22. Extrahieren von Werten aus verschachtelter Liste/Tupel/Wörterbuch
- 23. Extrahieren von numerischen Werten aus mySQL-Spalten Zeichenfolge Wert
- 24. Extrahieren von Werten mit Regex - C#
- 25. SQL Server: Konvertieren von kommagetrennten Werten in einer Zeichenfolge in Buckets basierend auf den Werten
- 26. Python - Extrahieren mehrerer Listen aus einer Liste von Listen nach Index
- 27. Wie kann ich Elemente aus Listen von Listen in R extrahieren?
- 28. Ersetzen von Werten in CMake-Listen
- 29. Kombinationen zwischen den Werten von Listen
- 30. Join Listen mit wiederholten Werten
In welcher Programmiersprache? – Asaph
Die D-Programmiersprache. –