f# - 如何在 F# 中编写 csv?

标签 f#

我如何将 F# 中的记录写入 csv?最好为某个变量的每个实例设置一行。我的记录和最终输出是一张如下图所示的 map 。

type Family =
    { Month : int
      Year : int
      Income : float
      Family : int
      Dogs : int
      Cats : int
    }

let monthly =
    timeMap
    |> Seq.ofList
    |> Seq.map(fun ((month,year), rows) ->
        { Month = month
          Year = year
          Income = rows.Inc
          Family = familyMap.[(month,year)].Children
          Dogs = familyMap.[(month,year)].Dogs
          Cats = familyMap.[(month,year)].Cats
        })
    |> List.ofSeq

let map = 
    monthly
    |> List.map (fun x -> (x.Year,x.Month),x)
    |> Map.ofList 

已编辑

这是我尝试过的方法,但我得到的错误是(A,B,C,D,E,F) are not defined建议我使用语法 new (type) args。最后一个错误出现在 >> MyCsvType

type MyCsvType = CsvProvider<Schema = "A (int), B (int), C (float), D (int), E (int), F (int)", HasHeaders = false>
let myCsvBuildRow (x:Family) = MyCsvType.Row(x.A,x.B,x.C,x.D,x.E,x.F)
let myCsvBuildTable = (Seq.map myCsvBuildRow) >> Seq.toList >> MyCsvType
let myCsv = monthly|> myCsvBuildTable
myCsv.SaveToString()

最佳答案

除了 myCsvBuildRow 函数需要使用正确的名称访问 Family 类型的成员外,您的代码几乎已经完成。在您的版本中,您正在访问 AB 等名称,但这些是 CSV 文件中列的名称,而不是成员的名称F#记录。以下对我有用:

type MyCsvType = CsvProvider<Schema = "A (int), B (int), C (float), D (int), E (int), F (int)", HasHeaders = false>

let myCsvBuildRow (x:Family) = 
  MyCsvType.Row(x.Month,x.Year,x.Income,x.Family,x.Dogs,x.Cats)
let myCsvBuildTable data = 
  new MyCsvType(Seq.map myCsvBuildRow data)

let myCsv = family |> myCsvBuildTable
myCsv.SaveToString()

关于f# - 如何在 F# 中编写 csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51111590/

相关文章:

F# 使用递归列表

generics - F# 代码引用和泛型函数

f# - 在 F# 中记录受歧视的联合

f# - 是否有更有效的方法来提取具有依赖于列表的索引的数组子集?

f# - F# (sharp) 编程语言有哪些负面/缺点/不好/限制?

csv - 来自 FSharp.Data 的 CSV typeprovider 的性能问题

f# - 为什么 F# 编译器会因为这个中缀运算符而失败?

asynchronous - 如果程序立即失败,则 MailboxProcessor 第一个循环无法运行

visual-studio - MonoDevelop F# 类型和函数签名的工具提示;它们存在吗?

f# - Pause Monad - monadic 类型应该是什么样的?