我可以在不提供样本的情况下使用CsvProvider编写标题吗?

时间:2016-09-21 16:08:05

标签: f# f#-data

为什么我在F#中使用CsvProvider<>创建一个新的CSV类型,如下所示:

type ThisCsv = CsvProvider<Schema = "A (decimal), B (string), C (decimal)", HasHeaders = false>

然后创建/填充/保存.csv,生成的文件不包含我指定的架构中的标头?看起来应该有一种方法可以在最终的.csv文件中包含标题,但情况并非如此。

设置HasHeaders = true错误,因为没有提供样本。 HasHeaders = true工作的唯一方法是获得样本.csv。在我看来,应该有一种方法来指定模式而不用一个样本,并在最终文件中包含标题。

当我使用可能包含架构标头的[nameOfMyCSV].Save()时,我是否遗漏了某些内容,或者这是不是可以做到?

1 个答案:

答案 0 :(得分:12)

我担心来自Schema的标头仅用于行的属性名称。要将它们保存在您保存的文件中,您必须提供Sample。但是,样本只能包含标题。此外,HasHeaders必须设置为true

type ThisCsv = CsvProvider<
                Sample="A, B, C", 
                Schema = "A(decimal), B, C(decimal)", 
                HasHeaders = true>

如果示例只包含标题,那么如果要指定数据类型,则还必须提供模式。

只有当您重命名Sample中的Schema标题时,您才能看到该架构仅用于属性:

type ThisCsv = CsvProvider<
                Sample="A, B, C", 
                Schema = "A->AA(decimal), B->BB, C(decimal)", 
                HasHeaders = true>

然后,生成的行将包含AABCC等属性。但生成的文件仍将包含ABC。此外,使用此架构创建的csv的Headers属性为Some [|"A"; "B"; "C"|]

// Run in F# Interactive
let myCsv = new ThisCsv([ThisCsv.Row(1.0m, "a", 2.0m)])
myCsv.Headers
// The last line returns: Some [|"A"; "B"; "C"|]

另外,为了更好地理解解析器内部发生的事情,值得一看GitHub中的源代码:CSV folder,特别是CsvRuntime.fs