import io.{lines, PrintWriter} data Table( header, rows ) def read( file ) = l = lines( file ) def next = vector( l.next().split(',') ) if l.isEmpty() then return Table( vector(), [] ) header = next() rows = seq() while l.hasNext() rows += next() Table( header, rows.toList() ) def write( table, out ) = w = if out is String then PrintWriter( out ) else out w.println( table.header.mkString(',') ) for r <- table.rows w.println( r.mkString(',') ) if out is String w.close() def updateRow( header, row, updates ) = r = dict( (header(i), row(i)) | i <- 0:header.length() ) updates( r ) vector( r(f) | f <- header ) def update( table, updates ) = Table( table.header, (updateRow(table.header, r, updates) | r <- table.rows).toList() ) def addColumn( table, column, updates ) = Table( table.header + [column], (updateRow(table.header + [column], r + [null], updates) | r <- table.rows).toList() ) t = addColumn( read('test.csv'), 'SUM', r -> r('SUM') = sum(int(v) | (_, v) <- r if v != null) ) write( t, 'test_out.csv' ) write( t, System.out )