In files we find persistent data. Files introduce complexity and bugs. A file may be unavailable, have invalid formatting, or be corrupted.
In the System.IO
namespace we find many useful types like StreamReader
. Methods like File.ReadAllLines
are also included.
StreamReader
Let us begin with a StreamReader
example. We introduce a type called Data. In the Read function, a member of Data, we open a StreamReader
and read in a file's lines.
use
-keyword ensures the StreamReader
is correctly disposed of when it is no longer needed.while
-loop to continue iterating over the lines in the file while they can be read. We read all the lines and print them.open System.IO type Data() = member x.Read() = // Read in a file with StreamReader. use stream = new StreamReader @"C:\programs\file.txt" // Continue reading while valid lines. let mutable valid = true while (valid) do let line = stream.ReadLine() if (line = null) then valid <- false else // Display line. printfn "%A" line // Create instance of Data and Read in the file. let data = Data() data.Read()carrot squash yam onion tomato"carrot" "squash" "yam" "onion" "tomato"
File.ReadAllLines
This is a simpler way to read all the lines in a file, but it may be less efficient on large files. ReadAllLines
returns an array of strings.
Seq.toList
to get a list from the array. And with Seq.where
we get a sequence of only capitalized lines in the list.open System open System.IO let lines = File.ReadAllLines(@"C:\programs\file.txt") // Convert file lines into a list. let list = Seq.toList lines printfn "%A" list // Get sequence of only capitalized lines in list. let uppercase = Seq.where (fun (n : String) -> Char.IsUpper(n, 0)) list printfn "%A" uppercaseABC abc Cat Dog bird fish["ABC"; "abc"; "Cat"; "Dog"; "bird"; "fish"] seq ["ABC"; "Cat"; "Dog"]
In F# we have access to the .NET Framework's IO library. This enables efficient and well-tested use of files. With StreamReader
we iterate over the lines in a file.
Although we can use constructs like the while
-loop, if and else, a simpler approach is to use methods like File.ReadAllLines
. The returned array can be used easily in F#.