2013-02-08 4 views
6

У меня есть в формате CSV мы выписываем для определенной операции регистрации. Тем не менее, одно из полей позволяет ввести пользователя, и мне нужно убедиться, что , если они вводят запятую в поле, которое мы разбираем и заменяем его чем-то, скажем, что Excel сможет читать и показывать запятая на своем месте (поэтому читатель csv не будет думать, что это конец столбца).Показать запятую в CSV без использования запятой

В настоящее время я заменяю запятую ,, но это показаны как буква строка в Excel.

Есть ли стандартный способ отображения запятой в CSV-файле без использования фактического символа запятой? Даже решение, которое работает только с excel, будет работать, так как большинство наших клиентов будут использовать Excel для просмотра этого файла.

ответ

17

Лучшим способ справиться с внедренными запятые, чтобы правильно цитирует файл CSV:

  • Столбцы, содержащие запятая должна быть указана
  • в кавычках столбцов, содержащих цитаты должны иметь цитата спаслись

Пример:

Джо Смит, "Джо Смит, младший", "Джо "" Человек" "Смит-младший"

Я написал метод расширения, который помогает решить эту проблему:

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

Usage:

logger.Write(myString.CsvQuote()); 

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

Спасибо. Я не знал, что синтаксические анализаторы CSV были достаточно умны, чтобы избежать целых полей, таких как строки –

+0

Не все, особенно Excel –

+1

@MareInfinitus: Excel понимает формат, который я описал. Я делаю это все время с огромными наборами данных. Почти любое программное обеспечение, которое поддерживается и претендует на обработку файлов CSV, будет понимать эту цитату. –

0

CSV также "символьные значения, разделенные", не только запятая.

Вы можете использовать любой символ в качестве разделителя, но tab или \t широко используется для этого, , поскольку он обычно не используется при вводе пользователем.

RFC, для CSV является RFC 4180

Он предлагает использовать поле данных и разделители поле. Вот оригинальный текст, обратите внимание на специальную часть Microsoft Excel в (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" 

Обратите внимание, что Excel распознает Таб из коробки

+0

Как и любой специальный символ, он * может * отображаться в данных для регистрации, если не сейчас, возможно, лет спустя после того, как кто-то обновит код. Я предлагаю правильное цитирование. –

+0

Вы не можете подготовиться к тому, чтобы кто-то нарушил ваш код годами. –

+0

Да, вы можете. Это называется «хорошая архитектура и дизайн». –

0

Вы можете поставить кавычки вокруг всего поля. Большинство парсеров CSV поймут, что запятая - это часть данных, а не конец поля.

Или используйте другой разделитель. Это потребует использования мастера импорта текста в Excel вместо того, чтобы просто открывать файл напрямую. Обычно я использую ~ или |.

+0

Это работало отлично для нас много лет назад, пока кто-то не назвал его компанию по строкам Store || (да, он использовал символы трубы). Специальные символы создают особые проблемы. Я настоятельно рекомендую использовать правильное цитирование. –

0

Включение строки в кавычки позволит вам использовать запятые.

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

Смежные вопросы