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

7

F#

我想读取一个csv文件,并输出一个List< List< string > >列表

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)需要定义一个类来“捕获”数据,或通过引用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个回答

16
如果你使用FSharp.Data,那么有一个CsvFile类可以读取任意的CSV文件。
例如:
let csv = CsvFile.Load(filename, hasHeaders = true)
csv.Rows
|> Seq.map (fun r -> (r.["Image"], float r.["Size"]))
从“Image”和“Size”列创建元组序列。 csv.Headers 是一个包含文件第一行标题的 string[] option 类型。
let csv = CsvFile.Load(filename, hasHeaders = false)
csv.Rows
|> Seq.map (fun r -> r.Columns |> List.ofArray)
|> List.ofSeq

可能是您想要的


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接