我可以在不提供示例的情况下使用 CsvProvider 编写 headers 吗?

Can I write headers with the CsvProvider without providing a sample?

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

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

然后 create/fill/save .csv,生成的文件不包含我指定的架构中的 headers?似乎应该有一种方法可以在最终的 .csv 文件中包含 headers,但事实并非如此。

设置HasHeaders = true 出错,因为没有提供示例。 HasHeaders = true 工作的唯一方法是有一个示例 .csv。在我看来,应该有一种方法可以在没有 样本的情况下指定架构 ,并在最终文件中包含 headers。

当我使用 [nameOfMyCSV].Save() 时,我是否遗漏了一些可以包含架构中的 headers 的东西,或者不能这样做?

恐怕 Schema 中的 headers 仅用于行的 属性 名称。要将它们保存在您保存的文件中,您必须提供 Sample。但是,示例只能包含 headers。此外,HasHeaders 必须设置为 true:

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

如果示例仅包含 headers,那么如果您想指定数据类型,则还必须提供架构。

只有在 Schema:

中重命名 Sample headers 时,才能看到该架构用于 属性
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 in general and CsvRuntime.fs