Ich habe die folgende Art von Zeichenfolge
var string = "'string, duppi, du', 23, lala"
Ich möchte die Zeichenfolge bei jedem Komma in ein Array aufteilen, aber nur die Kommas außerhalb der einfachen Anführungszeichen.
Ich kann den richtigen regulären Ausdruck für die Trennung nicht herausfinden ...
string.split(/,/)
wird mir geben
["'string", " duppi", " du'", " 23", " lala"]
aber das Ergebnis sollte sein:
["string, duppi, du", "23", "lala"]
Gibt es eine browserübergreifende Lösung?
javascript
regex
split
Hans
quelle
quelle
Antworten:
Haftungsausschluss
01.12.2014 Update: Die folgende Antwort funktioniert nur für ein ganz bestimmtes CSV-Format. Wie DG in den Kommentaren korrekt ausgeführt hat, passt diese Lösung NICHT zur RFC 4180-Definition von CSV und auch NICHT zum MS Excel-Format. Diese Lösung zeigt einfach, wie eine (nicht standardmäßige) CSV-Eingabezeile analysiert werden kann, die eine Mischung von Zeichenfolgentypen enthält, wobei die Zeichenfolgen maskierte Anführungszeichen und Kommas enthalten können.
Eine nicht standardmäßige CSV-Lösung
Wie austincheney richtig hervorhebt, müssen Sie die Zeichenfolge wirklich von Anfang bis Ende analysieren, wenn Sie Zeichenfolgen in Anführungszeichen, die möglicherweise maskierte Zeichen enthalten, richtig verarbeiten möchten. Außerdem definiert das OP nicht klar, was eine "CSV-Zeichenfolge" wirklich ist. Zuerst müssen wir definieren, was eine gültige CSV-Zeichenfolge und ihre einzelnen Werte ausmacht.
Gegeben: "CSV String" Definition
Für die Zwecke dieser Diskussion besteht eine "CSV-Zeichenfolge" aus null oder mehr Werten, wobei mehrere Werte durch ein Komma getrennt sind. Jeder Wert kann bestehen aus:
Regeln / Hinweise:
'that\'s cool'
.\'
in einfachen Anführungszeichen.\"
in doppelten Anführungszeichen.Finden:
Eine JavaScript-Funktion, die eine gültige CSV-Zeichenfolge (wie oben definiert) in ein Array von Zeichenfolgenwerten konvertiert.
Lösung:
Die von dieser Lösung verwendeten regulären Ausdrücke sind komplex. Und (IMHO) alle nicht trivialen regulären Ausdrücke sollten im Freiraummodus mit vielen Kommentaren und Einrückungen dargestellt werden. Leider erlaubt JavaScript keinen Freiraummodus. Daher werden die von dieser Lösung implementierten regulären Ausdrücke zunächst in nativer Regex-Syntax dargestellt (ausgedrückt mit Pythons praktischer Syntax:
r'''...'''
Raw-Multi-Line-String).Hier ist zunächst ein regulärer Ausdruck, der bestätigt, dass eine CVS-Zeichenfolge die oben genannten Anforderungen erfüllt:
Regex zur Validierung einer "CSV-Zeichenfolge":
Wenn eine Zeichenfolge mit dem obigen regulären Ausdruck übereinstimmt, ist diese Zeichenfolge eine gültige CSV-Zeichenfolge (gemäß den zuvor angegebenen Regeln) und kann mit dem folgenden regulären Ausdruck analysiert werden. Der folgende reguläre Ausdruck wird dann verwendet, um einen Wert aus der CSV-Zeichenfolge abzugleichen. Es wird wiederholt angewendet, bis keine Übereinstimmungen mehr gefunden werden (und alle Werte analysiert wurden).
Regex, um einen Wert aus einer gültigen CSV-Zeichenfolge zu analysieren:
Beachten Sie, dass es einen Sonderfallwert gibt, mit dem dieser reguläre Ausdruck nicht übereinstimmt - den allerletzten Wert, wenn dieser Wert leer ist. Dieser spezielle Fall "leerer letzter Wert" wird von der folgenden js-Funktion getestet und behandelt.
JavaScript-Funktion zum Parsen von CSV-Zeichenfolgen:
Beispiel für Ein- und Ausgabe:
In den folgenden Beispielen werden geschweifte Klammern verwendet, um die zu begrenzen
{result strings}
. (Dies dient zur Visualisierung von führenden / nachfolgenden Leerzeichen und Zeichenfolgen mit der Länge Null.)Zusätzliche Bemerkungen:
Diese Lösung erfordert, dass die CSV-Zeichenfolge "gültig" ist. Beispielsweise dürfen nicht in Anführungszeichen gesetzte Werte keine Backslashes oder Anführungszeichen enthalten, z. B. ist die folgende CSV-Zeichenfolge NICHT gültig:
Dies ist keine wirkliche Einschränkung, da jede Unterzeichenfolge entweder als einfacher oder doppelter Wert dargestellt werden kann. Beachten Sie auch, dass diese Lösung nur eine mögliche Definition für: "Kommagetrennte Werte" darstellt.
Bearbeiten: 2014-05-19: Haftungsausschluss hinzugefügt. Bearbeiten: 2014-12-01: Haftungsausschluss nach oben verschoben.
quelle
"field one", "field two", "a ""final"" field containing two double quote marks"
Ich habe die Antwort von Trevor Dixon auf dieser Seite nicht getestet, aber es handelt sich um eine Antwort, die sich mit der RFC 4180-Definition von CSV befasst.RFC 4180-Lösung
Dies löst die Zeichenfolge in der Frage nicht, da ihr Format nicht mit RFC 4180 übereinstimmt. Die akzeptable Codierung entgeht einem doppelten Anführungszeichen mit einem doppelten Anführungszeichen. Die folgende Lösung funktioniert ordnungsgemäß mit CSV-Dateien d / l aus Google-Tabellen.
UPDATE (3/2017)
Das Parsen einer einzelnen Zeile wäre falsch. Laut RFC 4180 können Felder CRLF enthalten, wodurch jeder Zeilenleser die CSV-Datei beschädigt. Hier ist eine aktualisierte Version, die CSV-Zeichenfolgen analysiert:
ALTE ANTWORT
(Einzeilige Lösung)
Und zum Spaß, hier ist, wie Sie CSV aus dem Array erstellen:
quelle
PEG-Grammatik (.js) für RFC 4180-Beispiele unter http://en.wikipedia.org/wiki/Comma-separated_values :
Testen Sie unter http://jsfiddle.net/knvzk/10 oder https://pegjs.org/online .
Laden Sie den generierten Parser unter https://gist.github.com/3362830 herunter .
quelle
Ich hatte einen ganz bestimmten Anwendungsfall, in dem ich Zellen aus Google Sheets in meine Web-App kopieren wollte. Zellen können doppelte Anführungszeichen und neue Zeilen enthalten. Beim Kopieren und Einfügen werden die Zellen durch Tabulatoren getrennt, und Zellen mit ungeraden Daten werden in doppelte Anführungszeichen gesetzt. Ich habe diese Hauptlösung ausprobiert, den verknüpften Artikel mit Regexp, Jquery-CSV und CSVToArray. http://papaparse.com/ Ist die einzige, die sofort funktioniert hat. Das Kopieren und Einfügen erfolgt nahtlos mit Google Sheets mit den Standardoptionen für die automatische Erkennung.
quelle
Die Antwort von FakeRainBrigand hat mir gefallen, sie enthält jedoch einige Probleme: Sie kann keine Leerzeichen zwischen Anführungszeichen und Komma verarbeiten und unterstützt keine zwei aufeinander folgenden Kommas. Ich habe versucht, seine Antwort zu bearbeiten, aber meine Bearbeitung wurde von Rezensenten abgelehnt, die meinen Code anscheinend nicht verstanden haben. Hier ist meine Version des Codes von FakeRainBrigand. Es gibt auch eine Geige: http://jsfiddle.net/xTezm/46/
quelle
Die Leute schienen dafür gegen RegEx zu sein. Warum?
Hier ist der Code. Ich habe auch eine Geige gemacht .
quelle
Hinzufügen eines weiteren zur Liste, da ich all das nicht ganz "KISS" genug finde.
Dieser verwendet Regex, um entweder Kommas oder Zeilenumbrüche zu finden, während er zitierte Elemente überspringt. Hoffentlich können Noobies dies selbst durchlesen. Der
splitFinder
reguläre Ausdruck hat drei Funktionen (geteilt durch a|
):,
- findet Kommas\r?\n
- findet neue Zeilen (möglicherweise mit Wagenrücklauf, wenn der Exporteur nett war)"(\\"|[^"])*?"
- überspringt alles, was in Anführungszeichen steht, da Kommas und Zeilenumbrüche dort keine Rolle spielen. Wenn\\"
das zitierte Element ein Escape-Angebot enthält , wird es erfasst, bevor ein Endangebot gefunden werden kann.quelle
Id, Name, Age 1, John Smith, 65 2, Jane Doe, 30
Wie kann ich anhand der von mir angegebenen Spalten analysieren?[{Id: 1, Name: "John Smith", Age: 65}, {Id: 2, Name: "Jane Doe", Age: 30}]
Wenn Sie Ihr Anführungszeichen durch doppelte Anführungszeichen setzen können, handelt es sich um ein Duplikat des JavaScript-Codes zum Parsen von CSV-Daten .
Sie können entweder alle einfachen Anführungszeichen zuerst in doppelte Anführungszeichen übersetzen:
... oder Sie können den regulären Ausdruck in dieser Frage bearbeiten, um einfache Anführungszeichen anstelle von doppelten Anführungszeichen zu erkennen:
Dies setzt jedoch ein bestimmtes Markup voraus, das aus Ihrer Frage nicht klar hervorgeht. Bitte klären Sie anhand meines Kommentars zu Ihrer Frage, welche Möglichkeiten Markup bietet.
quelle
Meine Antwort geht davon aus, dass Ihre Eingabe Code / Inhalt aus Webquellen widerspiegelt, bei denen einfache und doppelte Anführungszeichen vollständig austauschbar sind, sofern sie als nicht maskierte Übereinstimmungsmenge auftreten.
Sie können hierfür keinen regulären Ausdruck verwenden. Sie müssen tatsächlich einen Mikroparser schreiben, um die Zeichenfolge zu analysieren, die Sie teilen möchten. Um dieser Antwort willen werde ich die zitierten Teile Ihrer Zeichenfolgen als Unterzeichenfolgen bezeichnen. Sie müssen speziell über die Schnur gehen. Betrachten Sie den folgenden Fall:
In diesem Fall haben Sie absolut keine Ahnung, wo eine Teilzeichenfolge beginnt oder endet, indem Sie einfach die Eingabe für ein Zeichenmuster analysieren. Stattdessen müssen Sie eine Logik schreiben, um zu entscheiden, ob ein Anführungszeichen als Anführungszeichen verwendet wird, selbst nicht in Anführungszeichen steht und dass das Anführungszeichen keinem Escape folgt.
Ich werde diese Komplexität des Codes nicht für Sie schreiben, aber Sie können sich etwas ansehen, das ich kürzlich geschrieben habe und das das Muster hat, das Sie benötigen. Dieser Code hat nichts mit Kommas zu tun, ist aber ansonsten ein ausreichend gültiger Mikroparser, damit Sie Ihren eigenen Code schreiben können. Sehen Sie sich die Asifix-Funktion der folgenden Anwendung an:
https://github.com/austincheney/Pretty-Diff/blob/master/fulljsmin.js
quelle
Beim Lesen von csv zu string enthält es einen Nullwert zwischen den Strings. Versuchen Sie es also. \ 0 Zeile für Zeile funktioniert es für mich.
quelle
Um diese Antwort zu ergänzen
Wenn Sie Anführungszeichen analysieren müssen, die mit einem anderen Anführungszeichen versehen sind, Beispiel:
Sie können verwenden
quelle
"jjj "" kkk""","123"
Ich habe auch die gleiche Art von Problem gehabt, wenn ich eine CSV-Datei analysieren muss. Die Datei enthält eine Spaltenadresse, die das ',' enthält.
Nachdem ich diese CSV in JSON analysiert habe, erhalte ich eine nicht übereinstimmende Zuordnung der Schlüssel, während ich sie in eine JSON-Datei konvertiere.
Ich habe Node zum Parsen der Datei und der Bibliothek verwendet, wie Baby Parse und csvtojson.
Beispiel für Datei -
Während ich direkt analysierte, ohne Baby Parse in JSON zu verwenden, bekam ich
Also habe ich einen Code geschrieben, der das Komma (,) mit jedem anderen Trennzeichen in jedem Feld entfernt
Die zurückgegebene Funktion kann an die csvtojson-Bibliothek übergeben werden, sodass das Ergebnis verwendet werden kann.
quelle
Kein regulärer Ausdruck, lesbar gemäß https://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules
quelle
Laut diesem Blog-Beitrag sollte diese Funktion Folgendes tun:
Sie würden es so nennen:
Diese Art von jsfiddle funktioniert, aber es sieht so aus, als ob einige der Elemente Leerzeichen vor sich haben.
quelle
"'string, duppi, du', 23, lala"
["'string"," duppi"," du'"," 23"," lala"]
"'"
zu'"'
und umgekehrt gewechselt .'"string, duppi, du", 23, lala'
['"string',' duppi'.' du"',' 23',' lala']
Abgesehen von der hervorragenden und vollständigen Antwort von ridgerunner dachte ich an eine sehr einfache Problemumgehung, wenn Ihr Backend PHP ausführt.
Fügen Sie diese PHP - Datei auf Ihrer Domain - Backend (sagen:
csv.php
)Fügen Sie diese Funktion nun Ihrem Javascript-Toolkit hinzu (sollte meiner Meinung nach etwas überarbeitet werden, um Crossbrowser zu erstellen.)
Kostet Sie 1 Ajax-Anruf, aber zumindest duplizieren Sie weder Code noch fügen Sie eine externe Bibliothek hinzu.
Ref: http://php.net/manual/en/function.str-getcsv.php
quelle
Sie können papaparse.js wie im folgenden Beispiel verwenden:
quelle
Regelmäßige Ausdrücke zur Rettung! Diese wenigen Codezeilen verarbeiten korrekt in Anführungszeichen gesetzte Felder mit eingebetteten Kommas, Anführungszeichen und Zeilenumbrüchen basierend auf dem RFC 4180-Standard.
Sofern nicht anders angegeben, benötigen Sie keine endliche Zustandsmaschine. Der reguläre Ausdruck behandelt RFC 4180 dank positivem Lookbehind, negativem Lookbehind und positivem Lookahead ordnungsgemäß.
Klonen / Herunterladen von Code unter https://github.com/peterthoeny/parse-csv-js
quelle