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

Ste*_*ven 6 f# f#-data

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

type ThisCsv = CsvProvider<Schema = "A (decimal), B (string), C (decimal)", HasHeaders = false>
Run Code Online (Sandbox Code Playgroud)

然后创建/填充/保存.csv,生成的文件不包含我指定的架构中的标头?似乎应该有一种方法在最终的.csv文件中包含标题,但事实并非如此.

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

我在使用时遗漏[nameOfMyCSV].Save()了哪些内容可以包含模式中的标题,或者这可以不做?

Pio*_*ski 12

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

type ThisCsv = CsvProvider<
                Sample="A, B, C", 
                Schema = "A(decimal), B, C(decimal)", 
                HasHeaders = true>
Run Code Online (Sandbox Code Playgroud)

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

只有在重命名Sample标题时,才能看到模式仅用于属性Schema:

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

然后生成的行都会有样特性AA,B,CC.但是生成的文件仍会有A,B,C.此外,Headers使用此架构创建的csv 的属性将是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"|]
Run Code Online (Sandbox Code Playgroud)

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