【问题标题】:CSV specification - double quotes at the start and end of fieldsCSV 规范 - 字段开头和结尾的双引号
【发布时间】:2018-06-28 04:48:24
【问题描述】:

问题(因为我无法解决),""hello world"" 是否应该根据规范在 CSV 文件中成为有效字段值?

即应该:

1,""hello world"",9.5

是有效的 CSV 记录吗?

(如果是这样,那么我正在使用的 Perl CSV-XS 解析器有轻微损坏,但如果不是,那么 $line =~ s/\342\200\234/""/g; 是一个非常糟糕的主意;)

奇怪的是,这段代码多年来一直没有问题地运行,但我们刚刚创下了一个以左双引号开头且不包含逗号的记录(以上来自 CSV 预解析器)。

【问题讨论】:

    标签: perl csv


    【解决方案1】:

    CSV 的规范格式定义为https://www.rfc-editor.org/rfc/rfc4180.txt。它说:

    1. 每个字段可以用双引号括起来也可以不括起来(但是 某些程序(例如 Microsoft Excel)不使用双引号 完全)。如果字段没有用双引号括起来,那么 双引号可能不会出现在字段内。例如:

      "aaa","bbb","ccc" CRLF
      zzz,yyy,xxx

    2. 包含换行符 (CRLF)、双引号和逗号的字段 应该用双引号括起来。例如:

      "aaa","b CRLF
      bb","ccc" CRLF
      zzz,yyy,xxx

    3. 如果使用双引号将字段括起来,则使用双引号 出现在字段内必须通过在它前面加上 另一个双引号。例如:

      "aaa","b""bb","ccc"

    最后一条规则意味着您的行应该是:

    1,"""hello world""",9.5
    

    但并非所有解析器/生成器都完美地遵循此标准,因此您可能需要出于互操作性的原因来放宽一些规则。这完全取决于您对 CSV 格式写入和 CSV 格式解析部分的控制程度。

    【讨论】:

      【解决方案2】:

      这取决于您使用的转义字符。如果您的转义字符是'"'(双引号),那么您的行应该看起来像

      1,"""hello world""",9.5
      

      如果您的转义字符是 '\'(反斜杠),那么您的行应该是这样的

      1,"\"hello world\"",9.5
      

      检查您的解析器/环境默认值或使用您需要的转义字符显式配置您的解析器,例如使用反斜杠:

      my $csv = Text::CSV_XS->new ({ quote_char => '"', escape_char => "\\" });
      

      【讨论】:

      • Re "如果你的转义字符是'\'(反斜杠)那么你的行应该是这样的",在CSV中,转义字符通常是"。跨度>
      • @ikegami 当然。这里的重点是帮助开发者理解转义字符的功能并展示如何正确配置它。
      • 那你为什么显示如何配置错误(escape_char => "\\" 而不是正确和默认的escape_char => '"')?
      猜你喜欢
      • 2020-03-08
      • 2021-12-21
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      相关资源
      最近更新 更多