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.



import scala.io.Source
 
object parseCSV extends App {
 
  val rawData = """|C1,C2,C3,C4,C5
		  		   |1,5,9,13,17
		  		   |2,6,10,14,18
		  		   |3,7,11,15,19
		  		   |20,21,22,23,24""".stripMargin
 
  val data = Seq((Source.fromString(rawData).getLines()).map(_.split(",")).toSeq: _*)
 
  val output = ((data.take(1).flatMap(x => x) :+ "SUM").mkString(",") +: // Header line
    data.drop(1).map(_.map(_.toInt)). // Convert per line each array of String to array of integer
    map(cells => (cells, cells.sum)). //Add sum column to assemble a tuple. Part 1 are original numbers, 2 is the sum
    map(part => s"${part._1.mkString(",")},${part._2}")).mkString("\n")
 
  println(output)
  /* Outputs:
 
C1,C2,C3,C4,C5,SUM
1,5,9,13,17,45
2,6,10,14,18,50
3,7,11,15,19,55
20,21,22,23,24,110
 
*/
}