F#-将元组列表写入CSV文件

时间:2018-12-14 09:12:09

标签: list f# tuples

我需要将元组列表写入CSV文件。元组可以具有可变数量的字段和类型!我目前的工作如下:

module SOQN = 

    open System
    open System.IO
    open FSharp.Data

    let lstTuples = [(2, false, 83.23, "Alpha", 29); (3, true, 79.11, "Beta", 47); (5, false, 61.13, "Gamma", 71)]

    let main() =
        do 
            use writer = new StreamWriter(@"C:\tmp\ListTuples.csv")
            let lstTuplesIter = lstTuples |> List.iter writer.WriteLine
            lstTuplesIter
        0

    [<EntryPoint>]
    main() |> ignore

// Actual Output: 
// (2, False, 83.23, Alpha, 29)
// (3, True, 79.11, Beta, 47)
// (5, False, 61.13, Gamma, 71)
// 
// Expected Output: 
// 2, False, 83.23, Alpha, 29
// 3, True, 79.11, Beta, 47
// 5, False, 61.13, Gamma, 71
//

我想念什么?

3 个答案:

答案 0 :(得分:2)

尽管我同意@Jackson的观点,这可能不是正确的数据结构,但对于任意长度,您可能需要进行反射。

您将看到它们如何访问元组(“ ItemN”,其中N是数字)here的组成部分。

您可以遍历属性并获取动态案例的值。

请记住,使用反射效率很低(请参见here

答案 1 :(得分:1)

您正在做的是写出元组的F#文本解释,其中包括括号,如果您对元组进行解构并使用sprintf格式化输出,则可以得到所需的结果:

lstTuples |> List.iter (fun (a,b,c,d,e) -> writer.WriteLine (sprintf "%d,%A,%.2f,%s,%d" a b c d e ))

答案 2 :(得分:0)

感谢你们俩为您提供的专业知识。以下代码段可以根据需要工作(适应Tomas Petricek的代码):

module SOANS = 

open System
open System.IO
open FSharp.Reflection
open FSharp.Data

let lstTuples = [(2, false, 83.23, "Alpha", 29); (3, true, 79.11, "Beta", 47); (5, false, 61.13, "Gamma", 71)]

// https://stackoverflow.com/questions/13071986/write-a-sequence-of-tuples-to-a-csv-file-f    
let tupleToString t = 
  if FSharpType.IsTuple(t.GetType()) then
    FSharpValue.GetTupleFields(t)
    |> Array.map string
    |> String.concat ", "
  else failwith "not a tuple!"

let allIsStrings t = 
  t 
  |> Seq.map tupleToString
  |> Array.ofSeq

let main() =
    let lstTuples = [(2, false, 83.23, "Alpha", 29); (3, true, 79.11, "Beta", 47); (5, false, 61.13, "Gamma", 71)]
    let outTest = allIsStrings(lstTuples)
    File.WriteAllLines(@"C:\tmp\ListTuples.csv", outTest)
    0

[<EntryPoint>]
main() |> ignore