F# Files: open System.IO, use StreamReader
Use System.IO and StreamReader to read lines of text files. Specify the use, and open, keywords.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: This keyword ensures the StreamReader is correctly disposed of when it is no longer needed.
While: We use a while-loop to continue iterating over the lines in the file while they can be read. We read all the lines and print them.
For F# program that uses StreamReader, System.IO
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()
Contents of file.txt:
carrot
squash
yam
onion
tomato
Output
"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.
Here: We use Seq.toList to get a list from the array. And with Seq.where we get a sequence of only capitalized lines in the list.
F# program that uses File.ReadAllLines, Seq.toList
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" uppercase
Contents of file.txt:
ABC
abc
Cat
Dog
bird
fish
Output
["ABC"; "abc"; "Cat"; "Dog"; "bird"; "fish"]
seq ["ABC"; "Cat"; "Dog"]