2016-06-04 8 views
1

Kontext: Microsoft Visual Studio 2015-Community; F #So durchqueren Sie String [] [] in F #

Ich habe F # für etwa 1/2 pro Tag gelernt. Ich habe eine vage Idee, wie man funktionale Programmierung von einem Jahr macht, das mit mLite hantiert wird.

Das folgende Skript durchläuft eine Ordnerstruktur und ruft Protokolldateien ab. Die Dateien haben Einträge, die durch ~ abgegrenzt sind, und dort kann es einen oder mehrere geben.

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 

Deshalb an dieser Stelle data enthält eine String[][] und ich bin an einem bisschen von einem Verlust, um herauszufinden, wie man es sich in eine String[], ist die Idee, dass ich lange alle Protokolle in einer konvertieren möchten Vektor, so dass ich einige andere Transformationen darauf machen kann. Zum Beispiel beginnt jede Protokollzeile mit einer Datetime, also habe ich alles in eine lange Liste umgewandelt, die ich dann nach datetime sortieren kann.

Wohin von hier?

+2

[ 'Array.concat'] (https://msdn.microsoft.com/en-us/visualfsharpdocs/conceptual/array.concat [ 't] -function- [FSharp]) – ildjarn

+0

Nun, das war einfach. Na ja, so viel dazu. – bugmagnet

Antwort

6

Wie in den Kommentaren erwähnt, können Sie Array.concat verwenden:

files |> Array.map readFile |> Array.map dataLines |> Array.concat 

Jetzt sind einige Refactoring, die Zusammensetzung von zwei Karten auf der Karte der Zusammensetzung der beiden Funktionen entspricht.

files |> Array.map (readFile >> dataLines) |> Array.concat 

Schließlich map >> concat entspricht collect. So Ihr Code wird:

files |> Array.collect (readFile >> dataLines)