Библиотека для чтения CSV-файла в F#

F#

Мне интересно прочитать 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#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 ответ

Решение

Если вы используете FSharp.Data есть CsvFile класс, который может читать произвольные файлы CSV.

например

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

Создает последовательность кортежей из столбцов "Изображение" и "Размер".

csv.Headers это string[] option который содержит заголовки из первой строки файла.

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

может быть то, что вы после

Другие вопросы по тегам