将元数据存储在CSV文件中

时间:2015-06-09 18:24:02

标签: export-to-csv

我知道这会误用CSV格式。我确实理解更合适的解决方案是导出xls / xlsx文件,或者为用户提供OData端点,让他们使用power pivot来检索数据。目前我想坚持使用CSV,因为它更容易实现。

我需要将行的平面列表(报告)导出为CSV文件。同时我想要包含一些有关数据的元数据。例如。报告标题,生成日期和用户。

有没有一种巧妙的方法可以使用CSV文件格式来实现这两个目标?

此文件的意图用法是允许用户在Excel中打开文件并进行数据处理。

一种解决方案是将CSV分为两部分:元和数据。 E.g。

Title,Report Generation Date,Generated by User,,
Outstanding Jobs,5/5/2015,bkent@compusa.com,,
,,,,
Job Started, Estimated Completion, Description, Foo, Bar
9/3/2003,1/1/2006,"do something important""""",5,7
5/4/2007,2/2/2010,"do something else""""",3,12

或许有一个"标准"为此目的扩展为CSV格式?

此方法是否存在实用问题?

4 个答案:

答案 0 :(得分:1)

CSV没有允许存储元数据的标准扩展名。

您当然可以在文件中有一个单独的部分用于元数据,但由于CSV解析器必须处理单独的标题等,这往往会使处理变得复杂。标准的CSV解析器不会为您执行此操作。

考虑是否可以使用命名约定将元数据存储在单独的文件中,例如

MyData123.csv
MyData123-Meta.csv

您可以将它们捆绑到Zip存档中以将它们保持在一起,直到它们准备好进行处理。

答案 1 :(得分:1)

当我想在csv文件中添加一些元数据时,我最终将它作为json字符串存储为最后一列标题的一部分。

timestamp;x;y;z;heading#{"id": "-L4uNnjWXL2cLY_xpU_s"}
89318.329;0.00541;-0.00548;-0.00219;-1.0
89318.339;0.00998;0.0063;-0.00328;-1.0
89318.349;0.0043;0.01318;0.00069;-1.0
89318.359;0.00477;0.0138;0.0007;-1.0

与OP的建议相比,这种优势在于它是一个有效的csv文件,就所有行具有相同数量的列而言,每列只包含一种类型的数据。知道格式的解析器可以在#拆分标头并解析json元数据。不知道格式的解析器只会显示带有元数据的最后一列的标题。

答案 2 :(得分:0)

我最近遇到了这个问题,并找到了一个对我有用的“解决方案”。

我们的想法是将元数据编码在csv的第一行和/或最后一行中的单个单元格中,编码为json。

在你的程序中,你可以使用一堆装饰层来支持它:

  • 将CSV文件作为原始数据流读取的标准组件,即每行是字符串数组的流(“单元”)。对于此图层,第一行(即使它包含标签)在概念上与所有其他行没有区别。理想情况下,每一行都有相同数量的单元格,但这不是绝对必需的。
  • 一个可选组件,可以查看原始文件并提取最后一行的内容,而无需读取文件的其余部分。
  • 使用第一行的可选装饰器/适配器,将此行的第一个单元解析为json,并将其用作元数据。
  • 一个可选的装饰器/适配器,它知道它包含元数据,丢弃最后一行。
  • 一个可选的装饰器/适配器层,它将第一行作为列标签使用,然后将每一行作为关联数组/结构返回,并将列标签作为键。结果是关联数组流,其中值仍然是字符串。
  • 处理单元格内容的可选装饰器/适配器层。例如。如果一列包含json,它将解析这些单元格并将它们转换为对象。该层表现为对象流,其中属性值可以是各种类型。

我个人用PHP做过这个,但也应该可以在其他语言/环境中使用。

备注

为什么要在文件末尾而不是从头开始存储一些元数据?

典型的例子是总行数,只有在完全写入文件的其余部分后才能知道。

事实上,到目前为止,这是我使用此解决方案的唯一用例。我将这些文件命名为* .ncsv,表示最后一行包含行计数。但是,如果我们接受具有不同细胞计数的行,这仍然是技术上有效的csv。

当然无论你在这里做什么,处理这个文件的每一段代码都需要知道你提出的特殊格式。

答案 3 :(得分:0)

有一个 W3C recommendation for how to do this

这是一个示例:(示例 21:包含嵌入元数据的制表符分隔文件)

#   publisher   City of Palo Alto
#   updated 12/31/2010
#name   GID on_street   species trim_cycle  inventory_date
#datatype   string  string  string  string  date:M/D/YYYY
    GID On Street   Species Trim Cycle  Inventory Date
    1   ADDISON AV  Celtis australis    Large Tree Routine Prune    10/18/2010
    2   EMERSON ST  Liquidambar styraciflua Large Tree Routine Prune    6/2/2010

还有一个W3C CSV on the web community group.