RosettaCodeData/Task/CSV-data-manipulation/PL-I/csv-data-manipulation.pli

66 lines
1.3 KiB
Plaintext

*process source xref attributes or(!);
csv: Proc Options(Main);
/*********************************************************************
* 19.10.2013 Walter Pachl
* 'erase d:\csv.out'
* 'set dd:in=d:\csv.in,recsize(300)'
* 'set dd:out=d:\csv.out,recsize(300)'
* Say 'Input:'
* 'type csv.in'
* 'csv'
* Say ' '
* Say 'Output:'
* 'type csv.out'
*********************************************************************/
Dcl in Record Input;
Dcl out Record Output;
On Endfile(in) Goto part2;
Dcl (INDEX,LEFT,SUBSTR,TRIM) Builtin;
Dcl (i,j,p,m,n) Bin Fixed(31) Init(0);
Dcl s Char(100) Var;
Dcl iline(10) Char(100) Var;
Dcl a(20,20) Char(10) Var;
Dcl sum Dec Fixed(3);
Dcl oline Char(100) Var;
Do i=1 By 1;
Read File(in) Into(s);
iline(i)=s;
m=i;
Call sep((s));
End;
part2:
Do i=1 To m;
If i=1 Then
oline=iline(1)!!','!!'SUM';
Else Do;
sum=0;
Do j=1 To n;
sum=sum+a(i,j);
End;
oline=iline(i)!!','!!trim(sum);
End;
Write File(out) From(oline);
End;
sep: Procedure(line);
Dcl line Char(*) Var;
loop:
Do j=1 By 1;
p=index(line,',');
If p>0 Then Do;
a(i,j)=left(line,p-1);
line=substr(line,p+1);
End;
Else Do;
a(i,j)=line;
Leave loop;
End;
End;
n=j;
End;
End;