将 F# DataTable 写入 CSV 文件

Write F# DataTable to CSV file

我正在尝试将 F# DataTable 写入 csv(或输出为 txt)。我的table定义如下:

let setup_report_tbl ( tbl : DataTable ) =
    ignore( tbl.Columns.Add("business_date", typeof<System.Int32>) )
    ignore( tbl.Columns.Add("ticker", typeof<System.String>) )
    ignore( tbl.Columns.Add("price", typeof<System.String>) )
    ignore( tbl.Columns.Add("rate", typeof<System.Boolean>) )
    ignore( tbl.Columns.Add("range", typeof<System.Double>) )

我的目标是将这个空 table 和 headers 写入 csv 或 txt。我是 F# 的新手,不太确定从哪里开始,非常感谢您的帮助!

要将 DataTable 写成 CSV,我会这样做:

open System
open System.IO
open System.Data

let writeCsv (wtr : StreamWriter) (tbl : DataTable) =

    let writeValues (values : seq<_>) =
        String.Join(',', values)
            |> wtr.WriteLine

    tbl.Columns
        |> Seq.cast<DataColumn>
        |> writeValues

    for row in tbl.Rows do
        row.ItemArray |> writeValues

请注意,我没有做任何事情来检查值中的特殊字符,例如逗号或引号。

示例:

let tbl = new DataTable()
setup_report_tbl tbl
tbl.Rows.Add(1, "moo", "baa", true, 2.0) |> ignore
use wtr = new StreamWriter(Console.OpenStandardOutput())
writeCsv wtr tbl

输出为:

business_date,ticker,price,rate,range
1,moo,baa,True,2

更新

为了避免编译器错误,也许试试这个:

    let writeValues (values : seq<_>) =
        let s = String.Join(',', values)
        wtr.WriteLine(s)

请注意,s 是一个字符串,因此在调用 WriteLine 的哪个版本时应该没有歧义。

如果您想使用现有的库而不是编写自己的 CSV 编码(当您需要转义时可能会变得棘手),您可以使用 Deedle,它有一种从 DataTable 并将其保存到 CSV 文件中:

#r "nuget: Deedle"
open Deedle
open System.Data

// Setup table using your function and add some data
let tbl = new DataTable()
setup_report_tbl tbl
tbl.Rows.Add(1, "very\",evil'ticker", "", false, 1.23)

// Turn it into a dataframe and save it
let df = Frame.ReadReader(tbl.CreateDataReader())
df.SaveCsv("C:/temp/test.csv")

作为奖励,您可以查看来自 Deedle 的数据框类型是否允许您对数据执行其他一些您想要执行的操作 - 但这取决于您的场景。