123 lines
3.9 KiB
Plaintext
123 lines
3.9 KiB
Plaintext
/* NetRexx */
|
|
options replace format comments java crossref symbols
|
|
|
|
import org.apache.commons.csv.
|
|
|
|
-- =============================================================================
|
|
class RCsv public final
|
|
|
|
properties private constant
|
|
NL = String System.getProperty("line.separator")
|
|
COL_NAME_SUM = String 'SUM, "integers"'
|
|
CSV_IFILE = 'data/csvtest_in.csv'
|
|
CSV_OFILE = 'data/csvtest_sumRexx.csv'
|
|
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
method main(args = String[]) public static
|
|
Arg = Rexx(args)
|
|
iCvs = Reader null
|
|
oCvs = Writer null
|
|
parse arg ifile ofile .
|
|
if ifile = '', ifile = '.' then ifile = CSV_IFILE
|
|
if ofile = '', ofile = '.' then ofile = CSV_OFILE
|
|
say textFileContentsToString(ifile)
|
|
do
|
|
iCvs = BufferedReader(FileReader(ifile))
|
|
oCvs = BufferedWriter(FileWriter(ofile))
|
|
processCsv(iCvs, oCvs);
|
|
catch ex = IOException
|
|
ex.printStackTrace();
|
|
finally
|
|
do
|
|
if iCvs \= null then iCvs.close()
|
|
if oCvs \= null then oCvs.close()
|
|
catch ex = IOException
|
|
ex.printStackTrace()
|
|
end
|
|
end
|
|
say textFileContentsToString(ofile)
|
|
return
|
|
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
method processCsv(iCvs = Reader, oCvs = Writer) public static binary signals IOException
|
|
printer = CSVPrinter null
|
|
do
|
|
printer = CSVPrinter(oCvs, CSVFormat.DEFAULT.withRecordSeparator(NL))
|
|
oCvsHeaders = java.util.List
|
|
oCvsRecord = java.util.List
|
|
records = CSVFormat.DEFAULT.withHeader(String[0]).parse(iCvs)
|
|
irHeader = records.getHeaderMap()
|
|
oCvsHeaders = ArrayList(Arrays.asList((irHeader.keySet()).toArray(String[0])))
|
|
oCvsHeaders.add(COL_NAME_SUM)
|
|
printer.printRecord(oCvsHeaders)
|
|
recordIterator = records.iterator()
|
|
record = CSVRecord
|
|
loop while recordIterator.hasNext()
|
|
record = CSVRecord recordIterator.next()
|
|
oCvsRecord = record2list(record, oCvsHeaders)
|
|
printer.printRecord(oCvsRecord)
|
|
end
|
|
finally
|
|
if printer \= null then printer.close()
|
|
end
|
|
return
|
|
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
method record2list(record = CSVRecord, oCvsHeaders = java.util.List) private static binary returns java.util.List
|
|
cvsRecord = java.util.List
|
|
rMap = record.toMap()
|
|
recNo = record.getRecordNumber()
|
|
rMap = alterRecord(rMap, recNo)
|
|
sum = summation(record.iterator())
|
|
rMap.put(COL_NAME_SUM, sum)
|
|
cvsRecord = ArrayList()
|
|
loop ci = 0 to oCvsHeaders.size() - 1
|
|
key = oCvsHeaders.get(ci)
|
|
cvsRecord.add(rMap.get(key))
|
|
end ci
|
|
return cvsRecord
|
|
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
method alterRecord(rMap = Map, recNo = long) private static binary returns Map
|
|
rv = int
|
|
rg = Random(recNo)
|
|
rv = rg.nextInt(50)
|
|
ks = rMap.keySet().toArray(String[0])
|
|
ix = rg.nextInt(ks.length)
|
|
yv = long 0
|
|
ky = ks[ix];
|
|
xv = String rMap.get(ky)
|
|
if xv \= null & xv.length() > 0 then do
|
|
yv = Long.valueOf(xv).longValue() + rv
|
|
rMap.put(ks[ix], String.valueOf(yv))
|
|
end
|
|
return rMap
|
|
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
method summation(iColumn = Iterator) private static
|
|
sum = 0
|
|
loop while iColumn.hasNext()
|
|
nv = Rexx(String iColumn.next())
|
|
if nv = null, nv.length() = 0, \nv.datatype('n') then nv = 0
|
|
sum = sum + nv
|
|
end
|
|
return sum
|
|
|
|
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
method textFileContentsToString(filename) private static
|
|
lineOut = ''
|
|
fs = Scanner null
|
|
do
|
|
fs = Scanner(File(filename))
|
|
lineOut = lineout || filename || NL
|
|
loop while fs.hasNextLine()
|
|
line = fs.nextLine()
|
|
lineOut = lineout || line || NL
|
|
end
|
|
catch ex = FileNotFoundException
|
|
ex.printStackTrace()
|
|
finally
|
|
if fs \= null then fs.close()
|
|
end
|
|
return lineOut
|