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.



 
;; CSV -> LISTS
(define (csv->row line)  (map (lambda(x) (or (string->number x) x)) (string-split line ",")))
(define (csv->table csv) (map  csv->row (string-split csv "\n")))
 
;; LISTS -> CSV
(define (row->csv row) (string-join row ","))
(define (table->csv header rows)
    (string-join  (cons (row->csv header) (for/list ((row rows)) (row->csv row))) "\n"))
 
 
(define (task file)
 (let*
 	((table (csv->table file))
 	(header (first table))
 	(rows (rest table)))
 
 	(table->csv
 		(append header "SUM") ;; add last column
 		(for/list ((row rows)) (append row (apply + row))))))
 
 
 