上下文:Microsoft Visual Studio 2015社区; F#
我每天都在学习F#约半天。我对如何进行函数式编程有一个模糊的想法,花了一年的时间来摆弄mLite。
以下脚本遍历文件夹树并提取日志文件。这些文件的条目由~
分隔,并且可能有一个或多个。
open System
open System.IO
let files =
System.IO.Directory.GetFiles("C:\\scratch\\snapshots\\", "*.log", SearchOption.AllDirectories)
let readFile (file: string) =
//Console.WriteLine(file)
let text = File.ReadAllText(file)
text
let dataLines (line: string) =
line.Split('~')
let data =
files |> Array.map readFile |> Array.map dataLines
所以此时data
包含一个String[][]
而且我有点茫然无法弄清楚如何将其变成String[]
,这个想法是我想将所有日志转换为一个长向量,以便我可以对其进行一些其他转换。例如,每个日志行都以日期时间开始,因此将其全部转换为一个长列表,然后我可以对日期时间进行排序。
从哪里来?
答案 0 :(得分:6)
如评论中所述,您可以使用Array.concat
:
files |> Array.map readFile |> Array.map dataLines |> Array.concat
现在进行一些重构,两张地图的构图相当于两个函数组成的地图。
files |> Array.map (readFile >> dataLines) |> Array.concat
最后map >> concat
相当于collect
。所以你的代码变成了:
files |> Array.collect (readFile >> dataLines)