537 Stimmen

Umgang mit Kommas in einer CSV-Datei

Ich bin auf der Suche nach Vorschlägen, wie eine CSV-Datei zu behandeln ist, die von unseren Kunden erstellt und dann hochgeladen wird und die möglicherweise ein Komma in einem Wert enthält, z. B. einen Firmennamen.

Einige der Ideen, die wir in Betracht ziehen, sind: Bezeichner in Anführungszeichen (Wert "," Werte ", "usw.) oder die Verwendung eines | anstelle eines Kommas. Das größte Problem ist, dass wir es einfach machen müssen, sonst wird der Kunde es nicht tun.

2voto

Jonathan Wood Punkte 61798

Verwenden Sie einfach SoftCircuits.CsvParser auf NuGet. Es wird all diese Details für Sie erledigen und sehr große Dateien effizient handhaben. Und bei Bedarf kann es sogar Objekte importieren/exportieren, indem es Spalten auf Objekteigenschaften abbildet. Darüber hinaus haben meine Tests gezeigt, dass es im Durchschnitt fast 4 Mal schneller ist als der beliebte CsvHelper.

1voto

hariszhr Punkte 409

In der Regel kodiere ich die Felder, die beliebige Kommas oder Sonderzeichen enthalten können, mit einer URL. Und dekodiere sie dann, wenn sie in einem visuellen Medium verwendet/angezeigt werden.

(Kommas werden zu %2C)

Jede Sprache sollte über Methoden zur URL-Kodierung und Dekodierung von Zeichenketten verfügen.

z.B. in java

URLEncoder.encode(myString,"UTF-8"); //to encode
URLDecoder.decode(myEncodedstring, "UTF-8"); //to decode

Ich weiß, dass dies eine sehr allgemeine Lösung ist und möglicherweise nicht ideal für Situationen ist, in denen der Benutzer den Inhalt einer csv-Datei manuell anzeigen möchte.

1voto

user1451111 Punkte 1545

Normalerweise mache ich das in meinen Routinen zum Parsen von CSV-Dateien. Angenommen, die Variable "line" ist eine Zeile in einer CSV-Datei und alle Spaltenwerte sind in Anführungszeichen eingeschlossen. Nachdem die beiden folgenden Zeilen ausgeführt wurden, erhalten Sie CSV-Spalten in der Auflistung "values".

// The below two lines will split the columns as well as trim the DBOULE QUOTES around values but NOT within them
    string trimmedLine = line.Trim(new char[] { '\"' });
    List<string> values = trimmedLine.Split(new string[] { "\",\"" }, StringSplitOptions.None).ToList();

1voto

Daniel Punkte 19443

Die einfachste Lösung, die ich gefunden habe, ist die, die LibreOffice verwendet:

  1. Ersetzen Sie alle wörtlichen " von
  2. Setzen Sie doppelte Anführungszeichen um Ihre Zeichenkette

Sie können auch die von Excel verwendete Version verwenden:

  1. Ersetzen Sie alle wörtlichen " von ""
  2. Setzen Sie doppelte Anführungszeichen um Ihre Zeichenkette

Beachten Sie, dass andere Leute empfohlen haben, nur Schritt 2 auszuführen, aber das funktioniert nicht mit Zeilen, in denen ein " wird gefolgt von einer , wie in einer CSV-Datei, in der Sie eine einzelne Spalte mit der Zeichenfolge hello",world wie die CSV-Datei lauten würde:

"hello",world"

Dies wird als eine Zeile mit zwei Spalten interpretiert: hello y world"

1voto

Rajat26 Punkte 39
    public static IEnumerable<string> LineSplitter(this string line, char 
         separator, char skip = '"')
    {
        var fieldStart = 0;
        for (var i = 0; i < line.Length; i++)
        {
            if (line[i] == separator)
            {
                yield return line.Substring(fieldStart, i - fieldStart);
                fieldStart = i + 1;
            }
            else if (i == line.Length - 1)
            {
                yield return line.Substring(fieldStart, i - fieldStart + 1);
                fieldStart = i + 1;
            }

            if (line[i] == '"')
                for (i++; i < line.Length && line[i] != skip; i++) { }
        }

        if (line[line.Length - 1] == separator)
        {
            yield return string.Empty;
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X