CSV spreadsheet files are suitable for storing tabular data in a relatively portable way.

The CSV format is flexible but somewhat ill-defined.

For present purposes, authors may assume that the data fields contain no commas, backslashes, or quotation marks.



Task

Read a CSV file, change some values and save the changes back to a file.

For this task we will use the following CSV file:

C1,C2,C3,C4,C5
1,5,9,13,17
2,6,10,14,18
3,7,11,15,19
4,8,12,16,20

Suggestions


 Show how to add a column, headed 'SUM', of the sums of the rows.
 If possible, illustrate the use of built-in or standard functions, methods, or libraries, that handle generic CSV files.



let list_add_last this lst =
  List.rev (this :: (List.rev lst))
 
let () =
  let csv = Csv.load "data.csv" in
  let fields, data =
    (List.hd csv,
     List.tl csv)
  in
  let fields =
    list_add_last "SUM" fields
  in
  let sums =
    List.map (fun row ->
      let tot = List.fold_left (fun tot this -> tot + int_of_string this) 0 row in
      list_add_last (string_of_int tot) row
    ) data
  in
  Csv.output_all (Csv.to_channel stdout) (fields :: sums)