2013-02-08 102 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; 
      } 
      

      用法:

      logger.Write(myString.CsvQuote()); 
      
      var csv = string.Join(",", listOfStrings.Select(CsvQuote)) 
      
    +1

    谢谢。我不知道CSV解析器是否足够聪明,可以像那样的字符串逃避整个字段 – 2013-02-08 19:06:17

    +0

    并非所有的都可以,特别是Excel – 2013-02-08 19:13:45

    +1

    @MareInfinitus:Excel了解我描述的格式。我总是用大量的数据集来做这件事。几乎所有维护和声称处理CSV文件的软件都可以理解这种引用。 – 2013-02-08 19:17:06

    0

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

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

    用于CSV的RFC是RFC 4180

    它建议使用数据字段和字段分隔符。以下是原文, 请注意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

    像任何特殊字符一样,它*可以显示在要记录的数据中,如果不是现在,也许在有人更新代码后的几年中。我建议适当的引用。 – 2013-02-08 19:03:04

    +0

    你无法准备多年来破坏你的代码的人。 – 2013-02-08 19:07:33

    +0

    是的,你可以。它被称为“好的建筑和设计”。 – 2013-02-08 23:52:30

    0

    你可以把一个报价围绕整个领域。大多数CSV解析器都会理解逗号是数据的一部分,而不是字段的末尾。

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

    +0

    多年前,这对我们非常有用,直到有人将他的公司命名为Store ||。 (是的,他使用管道字符)。特殊字符会产生特殊问题。我强烈建议使用适当的引用。 – 2013-02-08 19:02:16

    0

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

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