用于在F#中读取csv文件的库

时间:2017-07-31 09:44:32

标签: csv f#

F#

我有兴趣阅读csv文件并输出List<列表与LT;字符串> >

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#Data依赖于定义一个Class来“捕获”数据,或者通过引用一个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">

但是输入文件的列数可能会改变(因此我无法定义抽象类)

当然,我可以编写正则表达式来逐行分解输入文件,但我很想知道其他人是否已经完成它(或者它是标准的库函数)。

谢谢。

1 个答案:

答案 0 :(得分:8)

如果您使用FSharp.Data,那么CsvFile类可以读取任意CSV文件。

e.g。

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

将从&#34; Image&#34;创建一系列元组。和&#34;尺寸&#34;列。

csv.Headersstring[] option,其中包含文件第一行的标题。

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

可能是你之后的