Hallo liebes Forum,

ich schätze die Beiträge sehr und trage auch selbst gerne zu Lösungen bei. Und doch wünsche ich mir mehr sachliche Diskussion und keine Diskussion in dem Stil: meine Lösung ist besser als deine. Für jede Aufgabenstellung gibt es mehrere Lösungen und die Leser des Forums sind gestandene IT-Fachleute, denen ich es zutraue, sich ein eigenes Urteil zu bilden, was die Vielfalt und Anwendbarkeit der Lösungen betrifft.

In diesem Sinne stelle ich meine Idee mit der SQL-Function Split() vor. Die Function kam mit 7.3 TR 6 auf die Maschine. Der Sourcecode der Function kann mit dem Navigator eingesehen werden, damit ist es möglich, diese Function auf einem älteren Release zu implementieren.

Unter dem Pfad /home/import/csv/adressen.csv sind folgende Daten gespeichert. Am Ende jedes Datensatzes ist ein Linefeed

PHP-Code:
10001,Leisha Leysner,80689,München,Amarellenweg
10002
,Darion Willimczik,81669,München,Schleibingerstraße
10003
,Helvi Holzwardt,81673,München,Dornbergstraße
10004
,Theofánis Arndgen,80997,München,Reinoltstraße
10005
,Tybi Klimczok,80999,München,Frühaufstraße
10006
,Lieschen Bredenkötter,80804,München,Max-von-Gruber-Straße
10007
,Andree Flächsenhaar,81369,München,Adunistraße
10008
,Heber Uschkerat,80937,München,Karlsteinstraße
10009
,Olyvia Füchtling,80331,München,Neuturmstraße
10010
,Art Berendes,80999,München,Grünwedelstraße 
Folgendes Statement liest die Datei und splittet sie in die einzelnen Datensätze

Carriage Return = chr(13)
Linefeed = chr(10)

Code:
select Ordinal_Position as Pos, Element
  from TABLE (SYSTOOLS.SPLIT(get_clob_from_file('/home/import/csv/adressen.csv'), chr(10)));
Das Ergebnis

PHP-Code:
Pos Element
-----------------------------------------------------------------------
1    10001,Leisha Leysner,80689,München,Amarellenweg
2    10002
,Darion Willimczik,81669,München,Schleibingerstraße
3    10003
,Helvi Holzwardt,81673,München,Dornbergstraße
4    10004
,Theofánis Arndgen,80997,München,Reinoltstraße
5    10005
,Tybi Klimczok,80999,München,Frühaufstraße
6    10006
,Lieschen Bredenkötter,80804,München,Max-von-Gruber-Straße
7    10007
,Andree Flächsenhaar,81369,München,Adunistraße
8    10008
,Heber Uschkerat,80937,München,Karlsteinstraße
9    10009
,Olyvia Füchtling,80331,München,Neuturmstraße
10   10010
,Art Berendes,80999,München,Grünwedelstraße 
Das RPG-Programm sieht es so aus
Code:
         ctl-opt dftactgrp(*no) main(main);
      //------------------------------------------------------------------//
      //                                                                  //
      // Einlesen einer CSV-Datei und Verarbeiten mit Split()             //
      //                                                                  //
      //-----------------                                                 //
      // R.Ross 01.2020 *                                                 //
      //------------------------------------------------------------------//
      // SQL-Options                                                      //
      //------------------------------------------------------------------//

         exec sql set option datfmt=*iso, timfmt=*iso, commit=*chg,
                             closqlcsr=*endactgrp;

      //------------------------------------------------------------------//
      // Array Records - wird mit SQL gefüllt                             //
      //------------------------------------------------------------------//

         dcl-ds  DsRecords   qualified dim(10000) inz;
                  Id         int(10);
                  Text       varchar(256);
         end-ds;

      //------------------------------------------------------------------//
      // Main                                                             //
      //------------------------------------------------------------------//
         dcl-proc main;

         dcl-s   LocFile     varchar(256);
         dcl-s   LocCounter  uns(10);

           LocFile = '/home/import/csv/adressen.csv';

           exec sql declare cursor01 cursor for
            select Ordinal_Position, Element
              from table (
                   systools.split(get_clob_from_file(:LocFile), chr(10)));

           exec sql open cursor01;

           exec sql fetch cursor01 for 10000 rows  // Fetch into Array
                     into :DsRecords;

           if sqlcode >= *zero;
              exec sql GET DIAGNOSTICS :LocCounter = ROW_COUNT;
           endif;

           exec sql close cursor01;

         end-proc;
      //------------------------------------------------------------------//
mit einem weiteren Split() auf den Datensatz werden die einzelnen Felder ausgelesen

Code:
select Ordinal_Position as Pos, Element
  from TABLE (SYSTOOLS.SPLIT('10001,Leisha Leysner,80689,München,Amarellenweg', ','));
Das liefert folgendes Ergebnis

PHP-Code:
Pos Element
------------------
1    10001
2    Leisha Leysner
3    80689
4    München
5    Amarellenweg 
Herzliche Grüße
Rainer Ross

Ab und zu entwickle ich auch mal Spiele für die IBM i
http://www.myhofi.com/tms/HTML/SlotMachine.html
http://www.myhofi.com/chess/index.html

aber normalerweise Webanwendungen so schnell wie Greenscreen
http://www.myhofi.com/tms/HTML/Myapp.html

hier ist der Kurs dazu
https://www.toolmaker.de/schulungen/...ibm-i-kompakt/