为什么我在F#中使用CsvProvider<>
创建一个新的CSV类型,如下所示:
type ThisCsv = CsvProvider<Schema = "A (decimal), B (string), C (decimal)", HasHeaders = false>
然后创建/填充/保存.csv,生成的文件不包含我指定的架构中的标头?看起来应该有一种方法可以在最终的.csv文件中包含标题,但情况并非如此。
设置HasHeaders = true
错误,因为没有提供样本。 HasHeaders = true
工作的唯一方法是获得样本.csv。在我看来,应该有一种方法来指定模式而不用一个样本,并在最终文件中包含标题。
当我使用可能包含架构标头的[nameOfMyCSV].Save()
时,我是否遗漏了某些内容,或者这是不是可以做到?
答案 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>
然后,生成的行将包含AA
,B
,CC
等属性。但生成的文件仍将包含A
,B
,C
。此外,使用此架构创建的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。