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 data manipulation
#
 
# declare a string stream to hold lines
decl string<> lines
 
# open the file specified on the command line, halting
# execution if they didn't enter one. it will be created if
# it doesn't exist yet
decl file f
if (< (size args) 2)
        out "error: please specify a csv file" endl console
        stop
end if
f.create args<1>
f.open args<1>
 
# read in all lines from the file
set lines (f.readlines)
 
# append sum column to header
set lines<0> (+ lines<0> ",SUM")
 
# determine sums and append them
decl int i sum
for (set i 1) (< i (size lines)) (inc i)
        set sum 0
        for (decl int j) (< j (size (split lines<i> ","))) (inc j)
                set sum (int (+ sum (int (split lines<i> ",")<j>)))
        end for
        set lines<i> (+ lines<i> (+ "," sum))
end for
 
# delete the file, then create it again
f.delete args<1>
f.create args<1>
 
# output all lines to the file
for (set i 0) (< i (size lines)) (inc i)
        out lines<i> endl f
end for