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.



test :- augment('test.csv', 'test.out.csv').
 
% augment( +InFileName, +OutFileName) 
augment(InFile, OutFile)  :- 
	open(OutFile, write, OutStream),
	( ( csv_read_file_row(InFile, Row, [line(Line)]),
	    % Row is of the form row( Item1, Item2, ....).
	    addrow(Row, Out),
	    csv_write_stream(OutStream, [Out], []),
	    fail
	  )
	; close(OutStream)
	).
 
% If the first item in a row is an integer, then append the sum;
% otherwise append 'SUM':
addrow( Term, NewTerm ) :-
	Term =.. [F | List],
	List = [X|_],
	(integer(X) -> sum_list(List, Sum) ; Sum = 'SUM'),
	append(List, [Sum], NewList),
	NewTerm =.. [F | NewList].
 