将 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 的数据框类型是否允许您对数据执行其他一些您想要执行的操作 - 但这取决于您的场景。
我正在尝试将 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 的数据框类型是否允许您对数据执行其他一些您想要执行的操作 - 但这取决于您的场景。