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.



 
EnableExplicit
 
#Separator$ = ","
 
Define fInput$ = "input.csv"; insert path to input file
Define fOutput$ = "output.csv"; insert path to output file  
Define header$, row$, field$
Define nbColumns, sum, i
 
If OpenConsole()
  If Not ReadFile(0, fInput$)
    PrintN("Error opening input file")
    Goto Finish
  EndIf
 
  If Not CreateFile(1, fOutput$)
    PrintN("Error creating output file")
    CloseFile(0)
    Goto Finish 
  EndIf
 
  ; Read header row
  header$ = ReadString(0)
  ; Determine number of columns
  nbColumns = CountString(header$, ",") + 1
  ; Change header row
  header$ + #Separator$ + "SUM"
  ; Write to output file
  WriteStringN(1, header$)
 
  ; Read remaining rows, process and write to output file
  While Not Eof(0)
    row$ = ReadString(0)
    sum = 0
    For i = 1 To nbColumns
      field$ = StringField(row$, i, #Separator$)
      sum + Val(field$)
    Next
    row$ + #Separator$ + sum
    WriteStringN(1, row$)
  Wend
 
  CloseFile(0)
  CloseFile(1)
 
  Finish:
  PrintN("")
  PrintN("Press any key to close the console")
  Repeat: Delay(10) : Until Inkey() <> ""
  CloseConsole()
EndIf
 