我有这样的数据集
1,2
3,4
5,6
7,8
9,0
Run Code Online (Sandbox Code Playgroud)
当我使用ReadAllLines读取它时,我得到一个字符串数组.到目前为止,我已经将字符串转换为包含字符串的列表数组
[["1";"2"];["3";"4"]... etc
Run Code Online (Sandbox Code Playgroud)
我需要最后一步才能得到这个 [[1;1;[1;4]... etc
我的代码现在:
module Data =
let load(path : string) (filename : string) =
System.IO.File.ReadAllLines(path + "\" + filename)
|> Array.toList
|> Seq.map (fun s -> s.Split [|','|] |> Array.toList)
|> Seq.map (fun s -> s |> Seq.map System.Int32.Parse)
Run Code Online (Sandbox Code Playgroud)
这是我测试它时返回的内容
val it : seq<seq<int>> = seq [seq [1; 2]; seq [3; 4]; seq [5; 6]]
Run Code Online (Sandbox Code Playgroud)
我期待这样的事情
val zz : int list list = [[1; 2]; [3; 4]]
Run Code Online (Sandbox Code Playgroud)
你几乎就在那里,现在你只需要将序列序列转换为列表列表:
|> Seq.map Seq.toList
|> Seq.toList
Run Code Online (Sandbox Code Playgroud)
|> Array.toList在这种情况下,您可以删除行更好,以处理序列,然后转换为列表作为最后一步.
另请注意,您可以使用System.IO.Path.Combine(path, filename)哪个将处理将路径与文件名组合的逻辑.
最后,你可以做一些重构:
|> Seq.map (fun s -> s |> Seq.map System.Int32.Parse)
Run Code Online (Sandbox Code Playgroud)
应用eta减少你可以删除lambda:
|> Seq.map (Seq.map System.Int32.Parse)
Run Code Online (Sandbox Code Playgroud)
然后
|> Seq.map (fun s -> s.Split [|','|] |> Array.toList)
|> Seq.map (fun s -> s |> Seq.map System.Int32.Parse)
|> Seq.map Seq.toList
Run Code Online (Sandbox Code Playgroud)
可以简化为单一,map因为x |> map f |> map g相当于x |> map (f >> g)
|> Seq.map ( (fun s -> s.Split [|','|]) >> Seq.map System.Int32.Parse >> Seq.toList)
Run Code Online (Sandbox Code Playgroud)
消除括号:
|> Seq.map (fun s -> s.Split [|','|] |> Seq.map System.Int32.Parse |> Seq.toList)
Run Code Online (Sandbox Code Playgroud)
您可以删除中间值lines并键入注释,因为Combine需要两个字符串.这是完整的代码:
open System
module Data =
let load path filename =
IO.File.ReadAllLines(IO.Path.Combine(path, filename))
|> Seq.map (fun s -> s.Split [|','|] |> Seq.map Int32.Parse |> Seq.toList)
|> Seq.toList
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |