以CSV格式显示逗号而不使用逗号字符

时间:2013-02-08 18:56:31

标签: c# csv character-replacement

我有一个以CSV格式登录我们为某个日志操作写出来。但是,其中一个字段允许用户输入,我需要确保如果他们在我们解析它的字段中输入逗号并将其替换为,比如说,Excel将能够在其位置读取和显示逗号(因此csv读者不会认为它是列的结尾)。

目前我将逗号替换为,,但在Excel中显示为文字字符串。

是否有标准方法可以在不使用实际逗号字符的情况下在CSV文件中显示逗号?即使只适用于excel的解决方案也可以使用,因为我们的大多数客户都将使用Excel来查看此文件。

4 个答案:

答案 0 :(得分:18)

处理嵌入式逗号的最佳方法是正确引用CSV文件:

  • 应引用包含逗号的列
  • 包含引号的引用列应该使报价转义

示例:

  乔史密斯,“Joe Smith,Jr。”,“Joe”“The Man”“Smith,Jr。”

我写了一个扩展方法来帮助解决这个问题:

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

用法:

logger.Write(myString.CsvQuote());

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

答案 1 :(得分:0)

CSV也是“字符分隔值”,不仅是逗号。

您可以使用任何字符作为分隔符,但tab\t广泛用于此, 因为它通常不在用户输入中使用。

CSV的RFC为RFC 4180

它建议使用数据字段和字段分隔符。这是原文, 请注意(5)

中Microsoft Excel的特殊部分
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识别开箱即用的标签

答案 2 :(得分:0)

您可以在整个字段周围加上引号。大多数CSV解析器都会理解逗号是数据的一部分而不是字段的结尾。

或使用其他分隔符。这将要求您使用Excel中的文本导入向导,而不是直接打开文件。我通常使用~|

答案 3 :(得分:0)

在引号内包含您的字符串将允许您使用逗号。

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