【问题标题】:Can a CSV file have a comment?CSV 文件可以有评论吗?
【发布时间】:2010-12-29 23:32:18
【问题描述】:

是否有任何官方方法允许 CSV 格式的文件允许 cmets,无论是在单独的行上还是在行尾?

我尝试检查 wikipediaRFC 4180,但两者都没有提及任何让我相信它不是文件格式的一部分的内容,所以这对我来说很不幸,我应该使用单独的自述文件。 txt 文件的东西来解释文件。

最后,我知道添加自己的 cmets 对我来说很容易,但我希望 Excel 之类的东西可以直接导入它,而无需消费者自定义导入过程。

那么,有什么想法吗?

【问题讨论】:

  • 你会评论什么?每行中的值还是文件本身?您可以选择 XML 文件吗?
  • 针对Python的提案被击落。
  • 可能是数据 @SquareRigMaster 的版本字符串。就像我现在想做的那样?
  • @SquareRigMaster – 或版权声明。

标签: csv comments standards file-format


【解决方案1】:

CSV 不是为包含 cmets 而设计的。我经常在 EXCEL 中将评论作为单独的列进行。从我的嵌入式程序中转储数据时,当我(例如)确实需要两个数据列时,通过添加额外的逗号,我为 cmets 创建了一个额外的(第三个)列,如下所示:

27,120,,
28,112,,
29,208,This is my comment,
30,85,,

【讨论】:

    【解决方案2】:

    在工程数据中,通常会在第一列中看到 # 符号,用于表示注释。

    我使用ostermiller CSV parsing library for Java 来读取和处理此类文件。该库允许您设置注释字符。解析操作后,您会得到一个仅包含真实数据的数组,没有 cmets。

    【讨论】:

    • 一些解析器(包括 Matlab)支持检测以前缀字符开头的行并将其作为 cmets 等以不同方式处理。例如,添加某种形式的“元”版本控制以优化/指导解释数据的代码可以可以通过评论实现,'#' 是我经常看到和使用的:#Csv/Version 1.9 Time,ValueA,ValueB 0.0, 123, 456 0.1, 123, 349
    • 使用 emacs,csv-comment-start 默认为 #
    • # 的使用也是语言技术中 TSV 格式(“CoNLL 格式”)的事实标准。这些格式比当前的 CSV 规范早了十多年。与 CSV 的主要区别在于它们要求分隔符是 TAB(或更早的 SPACE)而不是逗号,但从技术上讲,这仍然被视为 CSV 格式。
    【解决方案3】:

    如果您在批处理文件中使用 FOR 命令解析文件,则分号有效 (;)

    REM test.bat contents
    
    for /F "tokens=1-3 delims=," %%a in (test.csv) do @Echo %%a, %%b, %%c
    

    ;test.csv contents (this line is a comment)
    
    ;1,ignore this line,no it shouldn't
    
    2,parse this line,yes it should!
    
    ;3,ignore this line,no it shouldn't
    
    4,parse this line,yes it should!
    

    输出:

    2, parse this line, yes it should!
    
    4, parse this line, yes it should!
    

    【讨论】:

      【解决方案4】:

      如果你需要类似的东西:

        │ A                              │ B
      ──┼────────────────────────────────┼───
      1 │ #My comment, something else    │
      2 │ 1                              │ 2
      

      您的 CSV 可能包含以下行:

      "#My comment, something else"
      1,2
      

      密切注意第一行中的“引号”。

      使用 Excel 向导将文本转换为列时,请记住选中“将连续分隔符视为一个”,将其设置为使用“引号”作为分隔符。

      因此,Excel 将在逗号处拆分文本,将“注释”行保留为单列值(并且它会删除引号)。

      【讨论】:

        【解决方案5】:

        我认为将 cmets 添加到 CSV 文件的最佳方法是添加“评论”字段或直接记录到数据中。

        我使用过的大多数 CSV 解析应用程序都实现了字段映射和记录选择。因此,要评论字段的属性,请添加仅用于字段描述的记录。要评论记录,请在其末尾添加一个字段(实际上是所有记录),仅用于 cmets。

        这是我能想到的评论 CSV 文件的唯一两个原因。但我能预见的唯一问题是,如果任何一条记录未通过某些验证规则,程序将根本拒绝接受该文件。在这种情况下,您将很难为任何数字字段编写字符串类型的字段描述记录。

        不过,我绝不是专家,所以请随时指出我的理论中的任何错误。

        【讨论】:

        • Aaand,我只是读到您不想自定义导入过程。对不起。希望有人觉得这很有用。
        • 好帖子。我能想到的另一个可能需要 cmets 的原因是添加一些关于整个文件的元数据。仅使用此信息为一个单元格添加一整列或整行,这感觉有点尴尬。
        【解决方案6】:

        不,CSV 没有指定任何标记 cmets 的方式 - 它们只会由 Excel 等程序加载为包含文本的附加单元格。

        您可以管理的最接近的方法(将 CSV 导入特定的应用程序,如 Excel)是定义一种特殊的标记 cmets 的方法,Excel 将忽略该方法。对于 Excel,您可以通过将注释嵌入到公式中来“隐藏”注释(在有限的程度上)。例如,尝试将以下 csv 文件导入 Excel:

        =N("This is a comment and will appear as a simple zero value in excel")
        John, Doe, 24
        

        您仍然会在电子表格中看到一个显示数字 0 的单元格,但评论是隐藏的。

        或者,您可以通过简单地用空格填充文本来隐藏文本,这样它就不会显示在单元格的可见部分:

                                      This is a sort-of hidden comment!,
        John, Doe, 24
        

        请注意,您需要在注释文本后面加上逗号,以便 Excel 填充以下单元格,从而隐藏不适合该单元格的任何文本部分。

        令人讨厌的 hack,仅适用于 Excel,但它们可能足以使您的输出在导入后看起来更整洁。

        【讨论】:

          【解决方案7】:

          逗号分隔文件实际上只是一个文本文件,其中的行由逗号分隔的值组成。

          没有定义 CSV 文件内容的标准,因此没有明确的方式来表示注释。这取决于将要导入 CSV 文件的程序。

          当然,这通常是 Excel。您应该问自己 Excel 是如何定义注释的?换句话说,什么会使 Excel 忽略 CSV 文件中的一行(或一行的一部分)?我不知道有什么可以做到这一点。

          【讨论】:

          • There is no standard which defines the contents of a CSV fileFalse.
          • @Qix - 来自参考文档的第 2 节:“虽然 CSV 格式有各种规范和实现(例如 [4]、[5]、[6] 和 [7] ), 没有正式的规范存在”
          【解决方案8】:

          CSV“标准”(例如它)并没有规定应该如何处理 cmets,不,这取决于应用程序来建立约定并坚持下去。

          【讨论】:

          • RFC 4180 现在是标准。
          • RFC 4180 不是标准,rfc4180 告诉我们:“本备忘录为 Internet 社区提供信息。它没有指定任何类型的 Internet 标准。本备忘录的分发不受限制。”
          • 好的,我们可以说是事实上的标准吗?
          • 所有 RFC 都是备忘录,并非旨在提供任何 Internet 标准 AFAIK
          • 是的……那不是真的。有标准跟踪文件和非标准跟踪(信息)文件。整个流程,包括 IETF 发布文件的描述、流程和规则,均由 RFC2026 定义,并进行了一些修订。每个 RFC 都会在开头指定它所在的轨道。
          猜你喜欢
          • 1970-01-01
          • 2016-09-02
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 2014-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多