2017-07-31 73 views
2

F#庫在F#讀取CSV文件

我有興趣讀一個CSV文件和輸出列表<列表<字符串>>

let readCsv (filepath:string) : string list list = 
//....................... 

input file: 
Quote1,Quote2,Quote3 
"Hello,World","He said:""Yes""",Example 

Output: 
// Type: string list list 
[["Quote1";"Quote2";"Quote3"]; 
["Hello,World"; "He said:"Yes"";"Example"]] 

Input2: 
1,2,3,4,5,6 
7,8,9,10,11,12 

Output2: 
// Type: string list list 
[["1";"2";"3";"4";"5";"6"]; 
["7";"8";"9";"10";"11";"12"]] 

然而,一些的NuGet包,例如CsvHelper,FileHelper,F#數據依賴於定義一個類來「捕獲」數據,或者通過引用一個csv文件來定義一個類型。

https://joshclose.github.io/CsvHelper/

http://www.filehelpers.net/example/QuickStart/ReadWriteRecordByRecord/

http://fsharp.github.io/FSharp.Data/index.html

例如:

// In C#, from FileHelper Documentation 
[DelimitedRecord(",")] 
public class AbstractClass 
{ 
    public string Quote1; 
    public string Quote2; 
    public string Quote3; 
} 

// F# Data Documentation 
type AbstractType = CsvProvider<"../example.csv"> 

但輸入文件可能會因列數發生變化(因此我無法定義抽象類)

當然,我可以只寫正則表達式來逐行分解輸入文件,但我很感興趣知道是否有其他人已經完成了它(或者它是一個標準的庫函數)。

謝謝。

回答

7

如果使用FSharp.Data,則有CsvFile類可讀取任意CSV文件。

例如

let csv = CsvFile.Load(filename, hasHeaders = true) 
csv.Rows 
|> Seq.map (fun r -> (r.["Image"], float r.["Size"])) 

會從「圖像」和「大小」列創建一個元組序列。

csv.Headersstring[] option其中包含來自文件第一行的標題。

let csv = CsvFile.Load(filename, hasHeaders = false) 
csv.Rows 
|> Seq.map (fun r -> r.Columns |> List.ofArray) 
|> List.ofSeq 

可能是你

之後是什麼