我有许多列字符串列表(11),我想将它们组合成一个数组:
[List1]
Alpha
Bravo
Charlie
[List2]
3
5
7
[List3]
11
13
17
导出到csv文件:
[Array]
Alpha 3 11
Bravo 5 13
Charlie 7 17
这是可能的,如果是的话,怎么样?
答案 0 :(得分:1)
是的,基本上你想转置。您可以编写自己的函数或使用Matrix库或Deedle中的内容。这也很容易理解。您需要首先将列表的所有元素映射为字符串。最后使用String.concat
加入数组的元素:
let list1 = ["Alpha";"Bravo";"Charlie"]
let list2 = ["3";"5";"7"]
let list3 = ["11";"13";"17"]
let lists = [list1;list2;list3] // create a list of lists
[|for i in [0 .. (lists.Length - 1)] do
for j in [0 .. (lists.[i].Length - 1)] do
yield lists.[j].[i] // swap rows and columns
|]
|> Array.splitInto (lists.Length) //
|> Array.map (fun x -> String.concat "," x) // join the array elements with a comma for CSV output.
输出:
// val it : string [] = [|"Alpha,3,11"; "Bravo,5,13"; "Charlie,7,17"|]
在此之后,您可以使用File.WriteAllLines
或类似的方法将其转储到文件中。
修改强> 我们添加list4:
let list4 = ["19";"23";"29"]
let lists = [list1;list2;list3;list4]
如果你考虑一下,你会发现你想要每个列表的第一个元素,基本上是它的头部:
lists
|> List.map List.head
//val it : string list = ["Alpha"; "3"; "11"; "19"]
现在,如果你可以通过列表的剩余部分来解决这个问题(一旦你拿走了头部,你就会留下尾部),所以对于下一行:
lists
|> List.map List.tail
|> List.map List.head
//val it : string list = ["Bravo"; "5"; "13"; "23"]
现在,如果你可以重复这个,直到你用完了列表......你实际上可以通过递归:
let rec transpose xs =
match xs with
[]::xs -> []
| xs -> List.map List.head xs :: transpose (List.map List.tail xs)
transpose lists
|> Array.ofList
|> Array.map (fun x -> String.concat "," x)
//val it : string list list =
//[["Alpha"; "3"; "11"; "19"]; ["Bravo"; "5"; "13"; "23"];
// ["Charlie"; "7"; "17"; "29"]]
//val it : string [] = [|"Alpha,3,11,19"; "Bravo,5,13,23"; "Charlie,7,17,29"|]