2016-09-21 57 views
4

爲什麼,如果我創建F#中CsvProvider<>這樣一個新的CSV類型:我可以在不提供樣品的情況下用CsvProvider書寫標題嗎?

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

然後創建/填充/保存.csv,生成的文件不包含在架構中我的頭指定?似乎應該有一種方法在最終的.csv文件中包含標題,但情況並非如此。因爲沒有提供樣品,所以設置HasHeaders = true錯誤。 HasHeaders = true工作的唯一方法是獲取樣本.csv。在我看來,應該有一種方法來指定模式沒有一個示例,也包括最終文件中的標題。

我錯過了什麼,當我使用[nameOfMyCSV].Save(),可以包括架構的頭或不能這樣做?

回答

9

恐怕Schema的標題僅用於行的屬性名稱。要讓它們存儲在您節省的文件中,您必須提供Sample。儘管樣本只能包含標題。此外,HasHeaders必須被設置爲true

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

如果樣品只含有頭然後如果你想指定的數據類型的模式,必須也提供。

你可以看到,該模式被用於物業只有當你重命名SchemaSample標題:

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

然後生成的行會像AABCC性能。但生成的文件仍然有AB,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

+0

很好的解釋。謝謝! – Steven

相關問題