2013-02-08 14 views
6

Mam logowanie w formacie CSV wypiszemy dla pewnej operacji logowania. Jednak jedno z pól umożliwia wprowadzenie danych wejściowych użytkownika i muszę się upewnić, że , jeśli wprowadzą przecinek w polu, w którym je przeanalizujemy i zastąpią czymś w rodzaju, co powiedzmy, że program Excel będzie mógł czytać i wyświetlać przecinek na jego miejscu (aby czytnik csv nie pomyślał, że to koniec kolumny).Pokaż przecinek w CSV bez użycia przecinka

Obecnie zastąpić przecinek z , ale to pokazuje jak dosłownym ciąg w programie Excel.

Czy istnieje standardowy sposób wyświetlania przecinka w pliku CSV bez użycia rzeczywistego znaku przecinka? Nawet rozwiązanie, które działa tylko z programem Excel, będzie działało, ponieważ większość naszych klientów będzie używać programu Excel do wyświetlania tego pliku.

Odpowiedz

17

Najlepszym sposobem radzenia sobie z osadzonych przecinki jest prawidłowo zacytować pliku csv:

  • kolumn, które zawierają przecinek powinien być cytowany
  • cytowany kolumny, które zawierają cytat powinien mieć cytat uciekł

Przykład:

Joe Smith, "Joe Smith, Jr.", "Joe "" The Man" "Smith, Jr."

napisałem metodę rozszerzenia, które pomaga rozwiązać ten problem:

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; 
} 

Zastosowanie:

logger.Write(myString.CsvQuote()); 

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

Dzięki. Nie wiedziałem, że parsery CSV były wystarczająco inteligentne, aby uciec całymi polami w postaci takich ciągów znaków, jak –

+0

Nie wszystkie, zwłaszcza Excel –

+1

@MareInfinitus: Excel rozumie format, który opisałem. Robię to cały czas z ogromnymi zbiorami danych. Prawie każde oprogramowanie, które utrzymuje i twierdzi, że obsługuje pliki CSV, zrozumie to cytowanie. –

0

CSV jest również "charakter oddzielone wartości", a nie tylko przecinkiem.

Możesz użyć dowolnego znaku jako separatora, ale tab lub \t jest powszechnie używany do tego, , ponieważ zwykle nie jest używany w danych wejściowych użytkownika.

RFC do CSV jest RFC 4180

Sugeruje używać pól danych oraz separatory pól. Oto oryginalny tekst, proszę zwrócić uwagę na szczególną rolę programu Microsoft Excel w (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" 

Należy również pamiętać, że Excel rozpoznaje kartę z pola

+0

Jak każdy znak specjalny, * może * pokazywać dane, które mają być rejestrowane, jeśli nie teraz, może nawet o kilka lat wstecz, po tym, jak ktoś zaktualizuje kod. Sugeruję prawidłowe cytowanie. –

+0

Nie możesz się przygotować na łamanie kodu przez lata. –

+0

Tak, możesz. To się nazywa "dobra architektura i design". –

0

można umieścić cytaty wokół całego pola. Większość analizatorów plików CSV zrozumie, że przecinek jest częścią danych, a nie końcem pola.

Lub użyj innego separatora. Będzie to wymagało użycia kreatora importu tekstu w programie Excel zamiast otwierania pliku bezpośrednio. Zazwyczaj używam ~ lub |.

+0

To zadziałało dla nas wiele lat temu, dopóki ktoś nie nazwał jego firmy linią Sklepu || (tak, użył znaków potoku). Znaki specjalne stwarzają szczególne problemy. Sugeruję użycie właściwego cytowania. –

0

Wstawienie ciągu znaków wewnątrz cudzysłowu pozwoli Ci używać przecinków.

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

Powiązane problemy