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.



package require struct::matrix
package require csv
 
proc addSumColumn {filename {title "SUM"}} {
    set m [struct::matrix]
 
    # Load the CSV in
    set f [open $filename]
    csv::read2matrix $f $m "," auto
    close $f
 
    # Add the column with the sums
    set sumcol [$m columns]
    $m add column $title
    for {set i 1} {$i < [$m rows]} {incr i} {
	# Fill out a dummy value
	$m set cell $sumcol $i 0
	$m set cell $sumcol $i [tcl::mathop::+ {*}[$m get row $i]]
    }
 
    # Write the CSV out
    set f [open $filename w]
    csv::writematrix $m $f
    close $f
 
    $m destroy
}
 
addSumColumn "example.csv"