2013-02-08 7 views
6

Ich habe eine im CSV-Format anmelden wir schreiben für eine bestimmte Protokollierung. Allerdings erlaubt eines der Felder Benutzereingabe und ich muss sicherstellen, dass , wenn sie ein Komma in das Feld eingeben, dass wir es analysieren und durch etwas ersetzen, sagen wir, Excel wird in der Lage zu lesen und zu zeigen ein Komma an seiner Stelle (so wird der CSV-Leser nicht denken, dass es das Ende einer Kolumne ist).Zeige Komma in CSV ohne das Komma-Zeichen

Derzeit ersetze ich das Komma mit , aber das ist zeigt als wörtliche Zeichenfolge in Excel.

Gibt es eine Standardmethode, um ein Komma in einer CSV-Datei anzuzeigen, ohne das eigentliche Kommazeichen zu verwenden? Auch eine Lösung, die nur mit Excel funktioniert, wird funktionieren, da die meisten unserer Kunden Excel verwenden werden, um diese Datei anzuzeigen.

Antwort

17

Der beste Weg, eingebettete Kommas zu handhaben ist richtig die CSV-Datei zu zitieren:

  • Spalten, die ein Komma enthalten sollte
  • Zitiert Spalten angegeben werden, die ein Angebot enthalten sollte das Zitat
entkommen

Beispiel:

Joe Smith, "Joe Smith, Jr.", "Joe "" Der Mann" "Smith, Jr."

Ich schrieb eine Erweiterungsmethode, die das hilft lösen:

static public string CsvQuote(this string text) 
{ 
    if (text == null) return string.Empty; 

    bool containsQuote = false; 
    bool containsComma = false; 
    int len = text.Length; 

    for (int i = 0; i < len && (containsComma == false || containsQuote == false); i++) 
    { 
     char ch = text[i]; 
     if (ch == '"') 
     { 
      containsQuote = true; 
     } 
     else if (ch == ',' || char.IsControl(ch)) 
     { 
      containsComma = true; 
     } 
    } 

    bool mustQuote = containsComma || containsQuote; 

    if (containsQuote) 
    { 
     text = text.Replace("\"", "\"\""); 
    } 

    // Quote the cell and replace embedded quotes with double-quote or just return as is 
    return mustQuote ? "\"" + text + "\"" : text; 
} 

ANWENDUNG:

logger.Write(myString.CsvQuote()); 

var csv = string.Join(",", listOfStrings.Select(CsvQuote)) 
+1

Danke. Ich wusste nicht, dass CSV-Parser schlau genug waren, um ganze Felder als Strings zu umgehen –

+0

Nicht alle tun, besonders Excel –

+1

@MareInfinitus: Excel versteht das Format, das ich beschrieben habe. Das mache ich die ganze Zeit mit riesigen Datenmengen. Fast jede Software, die gepflegt wird und behauptet, mit CSV-Dateien umzugehen, wird dieses Angebot verstehen. –

0

CSV ist auch "Zeichen getrennte Werte", nicht nur Komma.

können Sie ein beliebiges Zeichen als Trennzeichen verwenden, aber die tab oder \t wird für diese weit verbreitet, wie es in Benutzereingabe normalerweise nicht verwendet.

Die RFC für CSV ist RFC 4180

Sie schlägt vor, Felder Daten zu verwenden und Feldtrennzeichen. Hier ist der ursprüngliche Text, beachten Sie bitte auf den besonderen Teil von Microsoft Excel in (5)

5. Each field may or may not be enclosed in double quotes (however 
    some programs, such as Microsoft Excel, do not use double quotes 
    at all). If fields are not enclosed with double quotes, then 
    double quotes may not appear inside the fields. For example: 

    "aaa","bbb","ccc" CRLF 
    zzz,yyy,xxx 

6. Fields containing line breaks (CRLF), double quotes, and commas 
    should be enclosed in double-quotes. For example: 

    "aaa","b CRLF 
    bb","ccc" CRLF 
    zzz,yyy,xxx 

7. If double-quotes are used to enclose fields, then a double-quote 
    appearing inside a field must be escaped by preceding it with 
    another double quote. For example: 

    "aaa","b""bb","ccc" 

Bitte beachten Sie auch, dass Excel Tab aus der Box erkennt

+0

Wie jedes Sonderzeichen kann es * in Daten auftauchen, um protokolliert zu werden, wenn nicht jetzt vielleicht Jahre später, nachdem jemand den Code aktualisiert hat. Ich schlage vor, richtig zu zitieren. –

+0

Sie können sich nicht darauf vorbereiten, dass jemand Ihren Code in Jahren bricht. –

+0

Ja, Sie können. Es heißt "gute Architektur und Design". –

0

Sie ein Anführungszeichen setzen können um das gesamte Feld herum. Die meisten CSV-Parser werden verstehen, dass das Komma Teil der Daten und nicht das Ende des Feldes ist.

Oder verwenden Sie einen anderen Separator. Dazu müssen Sie den Text-Import-Assistenten in Excel verwenden, anstatt die Datei direkt öffnen zu können. Ich verwende normalerweise ~ oder |.

+0

Das hat vor Jahren so gut geklappt, bis jemand seine Firma nach dem Vorbild von Store || benannt hat (Ja, er hat Pipe-Zeichen benutzt). Sonderzeichen erzeugen spezielle Probleme. Ich schlage vor, die richtigen Zitate zu verwenden. –

0

Wenn Sie Ihre Zeichenfolge in Anführungszeichen einschließen, können Sie Kommas verwenden.

"please sir,", can I, have some more?