【问题标题】:Show comma in CSV without using the comma character在 CSV 中显示逗号而不使用逗号字符
【发布时间】:2013-01-24 14:59:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# csv character-replacement


    【解决方案1】:

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

    • 应引用包含逗号的列
    • 包含引号的引用列应该对引号进行转义

    例子:

    Joe Smith,“Joe Smith, Jr.”,“Joe”“男人”“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))
    

    【讨论】:

    • 谢谢。我不知道 CSV 解析器足够聪明,可以将整个字段作为字符串转义
    • 不是所有的,尤其是 Excel
    • @MareInfinitus:Excel 理解我描述的格式。我一直使用庞大的数据集来做这件事。几乎所有维护并声称可以处理 CSV 文件的软件都会理解此引用。
    • 引用通常是做这些事情的好方法。取决于您使用的解析器。
    • @ChrisMarisic:谢谢。前段时间我在自己的代码库中进行了类似的更改。将您的更改整合到答案中。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 多年前这对我们非常有用,直到有人将他的公司命名为 Store || (是的,他使用了竖线字符)。特殊字符会产生特殊问题。我强烈建议使用正确的引用。
      【解决方案4】:

      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 可以开箱即用地识别 Tab

      【讨论】:

      • 像任何特殊字符一样,它可以显示在要记录的数据中,如果不是现在,也许在有人更新代码之后的几年之后。我建议正确引用。
      • 多年来总会有一个糟糕的程序员破坏你的架构和设计。没有灵丹妙药。
      • “你总是可以被醉酒的司机咬到”并不意味着系好安全带是个坏主意。练习完善的架构和设计会减少技能较低的开发人员破坏事物的机会。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多