91 lines
2.3 KiB
Text
91 lines
2.3 KiB
Text
--- Read CSV file and add columns headed with 'SUM'
|
|
--- with trace
|
|
-- trace(0)
|
|
|
|
include get.e
|
|
include std/text.e
|
|
|
|
function split(sequence s, integer c)
|
|
sequence removables = " \t\n\r\x05\u0234\" "
|
|
sequence out
|
|
integer first, delim
|
|
out = {}
|
|
first = 1
|
|
while first <= length(s) do
|
|
delim = find_from(c,s,first)
|
|
if delim = 0 then
|
|
delim = length(s)+1
|
|
end if
|
|
out = append(out,trim(s[first..delim-1],removables))
|
|
first = delim + 1
|
|
end while
|
|
return out
|
|
end function
|
|
|
|
procedure main()
|
|
integer fn -- the file number
|
|
integer fn2 -- the output file number
|
|
integer e -- the number of lines read
|
|
object line -- the next line from the file
|
|
sequence data = {} -- parsed csv data row
|
|
sequence headerNames = {} -- array saving column names
|
|
atom sum = 0.0 -- sum for each row
|
|
sequence var -- holds numerical data read
|
|
|
|
-- First we try to open the file called "data.csv".
|
|
fn = open("data.csv", "r")
|
|
if fn = -1 then
|
|
puts(1, "Can't open data.csv\n")
|
|
-- abort();
|
|
end if
|
|
|
|
-- Then we create an output file for processed data.
|
|
fn2 = open("newdata.csv", "w")
|
|
if fn2 = -1 then
|
|
puts(1, "Can't create newdata.csv\n")
|
|
end if
|
|
|
|
-- By successfully opening the file we have established that
|
|
-- the file exists, and open() gives us a file number (or "handle")
|
|
-- that we can use to perform operations on the file.
|
|
|
|
e = 1
|
|
while 1 do
|
|
line = gets(fn)
|
|
if atom(line) then
|
|
exit
|
|
end if
|
|
data = split(line, ',')
|
|
|
|
if (e=1) then
|
|
-- Save the header labels and
|
|
-- write them to output file.
|
|
headerNames = data
|
|
for i=1 to length(headerNames) do
|
|
printf(fn2, "%s,", {headerNames[i]})
|
|
end for
|
|
printf(fn2, "SUM\n")
|
|
end if
|
|
|
|
-- Run a sum for the numerical data.
|
|
if (e >= 2) then
|
|
for i=1 to length(data) do
|
|
printf(fn2, "%s,", {data[i]})
|
|
var = value(data[i])
|
|
if var[1] = 0 then
|
|
-- data read is numerical
|
|
-- add to sum
|
|
sum = sum + var[2]
|
|
end if
|
|
end for
|
|
printf(fn2, "%g\n", {sum})
|
|
sum = 0.0
|
|
end if
|
|
e = e + 1
|
|
end while
|
|
|
|
close(fn)
|
|
close(fn2)
|
|
end procedure
|
|
|
|
main()
|