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.



 
(require '[clojure.data.csv :as csv]
         '[clojure.java.io :as io])
 
(defn add-sum-column [coll] 
  (let [titles (first coll)
        values (rest coll)]
    (cons (conj titles "SUM") 
      (map #(conj % (reduce + (map read-string %))) values))))
 
(with-open [in-file (io/reader "test_in.csv")]
  (doall
    (let [out-data (add-sum-column (csv/read-csv in-file))]
      (with-open [out-file (io/writer "test_out.csv")]
        (csv/write-csv out-file out-data)))))
 