RosettaCodeData/Task/CSV-data-manipulation/FunL/csv-data-manipulation.funl

46 lines
1.1 KiB
Plaintext

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 )