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"]]
Run Code Online (Sandbox Code Playgroud)
但是,一些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;
}
Run Code Online (Sandbox Code Playgroud)
要么
// F# Data Documentation
type AbstractType = CsvProvider<"../example.csv">
Run Code Online (Sandbox Code Playgroud)
但是输入文件的列数可能会改变(因此我无法定义抽象类)
当然,我可以编写正则表达式来逐行分解输入文件,但我很想知道其他人是否已经完成它(或者它是标准的库函数).
谢谢.
mar*_*lam 10
如果你使用FSharp.Data的是一个CsvFile可以读取任意CSV文件的类.
例如
let csv = CsvFile.Load(filename, hasHeaders = true)
csv.Rows
|> Seq.map (fun r -> (r.["Image"], float r.["Size"]))
Run Code Online (Sandbox Code Playgroud)
将从"图像"和"大小"列创建一系列元组.
csv.Headers是string[] option包含文件第一行标题的.
let csv = CsvFile.Load(filename, hasHeaders = false)
csv.Rows
|> Seq.map (fun r -> r.Columns |> List.ofArray)
|> List.ofSeq
Run Code Online (Sandbox Code Playgroud)
可能就是你想要的
| 归档时间: |
|
| 查看次数: |
992 次 |
| 最近记录: |