Lecture 18-1
Marks to Report Example
This lecture covers a mini assignment example about converting a csv file containing students marks into a report containing the students averages. These are presented in the following format:
aaa 70 65 67 60
bbb 55 60 55 65
ccc 40 40 40 40
ddd 80 60 75 60
ccc 0 0 0 100
And should be transformed to be:
aaa 65.5
bbb 58.75
ccc 40.0
ddd 68.75
ccc 25.0
See the slides for the full examples.
Reading files in Haskell
We can read a file using readFile:
- This is an IO function.
- We will study this in more detail later on.
> readfile "marks.csv"
> "aaa 70 65 67 60\nbbb 55 60 55...
The \n character is the newline character.
lines
The lines function takes a string containing multiple lines into a list of strings. The complement to this function is the function unlines. This will do the opposite.
Parsing the File
Using the functions words and lines we can put the file into a list of lists of strings, in order to process the file.
Getting the Averages
The function read will convert a string into a float.
Writing the Output File
The function writeFile will write some data into a file:
> writeFile "test.txt" "hello"
This is not a pure function and we will see it again later.
All in One Function
The pure function portion of the exercise will read as the following:
report file =
let
parsed = map words . lines $ file
students = map name parsed
averages = map average parsed
zipped = zipWith report_line students averages
in
unlines zipped