我需要将元组列表写入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
//
我想念什么?
答案 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