[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Apr 2003
    Beiträge
    195

    Unhappy CSV gemischt mit Satzformaten oder wie werde ich verrückt



    Hallo allerseits,

    mein Kollege überraschte mich dieser Tag mit einem, von seiner Seite aus ernstgemeinten,
    Vorschlag für die Einführung einer neuen Satzart im Zuge der Verarbeitung von ERP-Daten
    auf einem PC die auf die AS/400 ins ERP System übernommen werden müssen.

    Bis jetzt haben wir für jede zu übermittelnde Art ein bestimmtes Satzformat, das durch die
    Satzart (die ersten 2 Stellen einer Zeile) gekennzeichnet ist. Dadurch kann man natürlich
    relativ einfach den Feldern in einer Datenbank die entsprechenden Werte zuordnen.

    Nun ist er aber auf die Idee gekommen inmitten all dieser Daten eine neue Satzart einzufügen,
    deren Werte als CSV-Daten übermittelt werden.

    Dies sieht dann in etwa so aus:
    in diesem Beispiel sind die ersten 3 Sätze nach dem normalen Schema, wobei L1, L2, LT
    einen Lieferschein betreffen und der 4. Satz nach seinem neuen Konzept eine Tankkartenabrechnung - Satzart TA.

    Code:
    L11304080011010028084    DIESELKRAFTSTOFF L       000  000005005 000011442000
    L200000000000000XXXXXX000                         02200000001  00000000000000
    LT13040800110100     Rabatt pro L  : 0.01                   
    TA6;72;20111201;852;17;5;110100;20130408;100906;28084;50,05;1,3610;68,1200;1
    Ich soll jetzt diesen TA Satz im CSV Stil vearbeiten. Ja relativ einfach nach ; suchen,
    dann hat man mal das Feld abgegrenzt. Aber jetzt kommt es, was wenn auf einmal
    solche Werte im CSV stehen:

    Code:
    """Text""";Text;1;1,98;"3;4";"A;B;""C"
    Übersetzt muss das dann heißen:

    Code:
    Feld1: "Text"
    Feld2: Text
    Feld3: 1
    Feld4: 1,98
    Feld5: 3;4
    Feld6: A;B;"C
    wie kriegt man das aber in ILERPG auf die Reihe ???
    Wonach muss ich zuerst suchen? Kennt jemand Code Snippets
    die das können?

    Bin für jede Info dankbar die zum Ziel führt.

  2. #2
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Ich denke, %scan ist Dein Freund. Im Prinzip musst Du nur die Ausnahmen mit " "" """ abarbeiten. Ist doch eine reizvolle Aufgabe - hab ähnliches soeben für einen Webservice gelöst.
    kf

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Mit %scan ist das so einfach nicht lösbar, da eben ein ";" auch im Text vorkommen könnte.
    Hier hilft leider nur eine Schleife mit Zeichenweiser Verarbeitung.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    Hi,
    Wenn ich mir Feld 6 ansehe und mir vorstelle, das das nur ein Bsp. ist und du mit schlimmeren Daten rechnest hast du keine Chance. Zumal vor dem C nur 2 " sind und nicht 3,

    Wenn der Schnittstellen Partner solche Daten liefern will, müßt Ihr euch auf einen wirklich einmaligen Trenner einigen
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  5. #5
    Registriert seit
    Apr 2003
    Beiträge
    195
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Mit %scan ist das so einfach nicht lösbar, da eben ein ";" auch im Text vorkommen könnte.
    Hier hilft leider nur eine Schleife mit Zeichenweiser Verarbeitung.
    Ich glaube nicht einmal die zeichenweise Verarbeitung kann hier weiterhelfen. Wann genau ist ein " lediglich ein " innerhalb eines Textes und wann gilt es als Textbegrenzer???

    Man kann ja nicht mal sagen, dass ein ; vor einem " auf ein kommendes Textfeld hinweist (siehe Feld6).

    Da bin ich echt ratlos.

  6. #6
    Registriert seit
    Apr 2003
    Beiträge
    195
    Zitat Zitat von camouflage Beitrag anzeigen
    Ich denke, %scan ist Dein Freund. Im Prinzip musst Du nur die Ausnahmen mit " "" """ abarbeiten. Ist doch eine reizvolle Aufgabe - hab ähnliches soeben für einen Webservice gelöst.
    Wie wäre denn die Ausnahme zu lösen? Was ist, wie schon Fürchau erwähnte, mit ';' innerhalb eines Textes?

  7. #7
    Registriert seit
    May 2002
    Beiträge
    1.121
    Hmm,
    nur mal so ein Gedanke.

    • Die Zeile(n) mit der neuen Satzart aus dieser Datei in eine seperate Datei
    • Diese dann wieder in das IFS schubsen
    • und jetzt mit cpyfrmimpf auf die Zieldatei kopieren


    Denke das der CPYFRMIMPF alles nötige erledigen sollte


    Gruß
    Ronald

  8. #8
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Die Frage mit den Ausnahmefällen ist hypothetisch gestellt, ja?

    Als schneller Gedanke käme mir in einem solchen Fall (mit RPG) ein Array mit den Feldinhalten und eine "Shift-Lösung" in den Sinn. Lösbar ist das schon - nur ob's so Sinn macht, ist wieder eine andere Frage.

    Nämlich wenn Du einen solchen Import mit Excel machst, rennst Du in die genau gleichen Probleme, da ja der Feldseperator unterschiedlich verwendet wird. Daher bin ich auch skeptisch der Lösung, die Ronald vorgeschlagen hat.

    Korrektur:
    Excel-Import funktioniert so, ergo könntest Du mit Ronalds Vorschlag durchaus Erfolg haben.
    kf

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Du kannst dir ein Array mit dim(n) für die Felder mit varying definieren.

    d Source 120 varying
    d MyField 100 dim(20)
    d AktPos 5I 0
    d EndPos 5I 0
    d FInd 5I 0

    c/free
    Source = %trimr(Quellfeld) + ";"; // Endekennzeichen setzen
    FInd = 1;
    for AktPos = 1 to %len(Source);

    select
    when substr(Source:AktPos:1) = """";

    for EndPos = AktPos + 1 to %len(Source);

    select;
    when %subst(Source:EndPos:1) = """"""; // 2 Anführungszeichen
    MyField(Find) += %subst(Source:EndPos:1);
    EndPos += 1;

    when %subst(Source:EndPos:2) = """;"; // Feldende
    AktPos = EndPos + 2;
    FInd += 1;
    leave;

    other;
    MyField(Find) += %subst(Source:EndPos:1);

    endsl;
    next;

    other;

    EndPos = %scan(";":AktPos:Source);
    if EndPos = *zero; // letztes Feld
    EndPos = %len(Source) + 1;
    endif;
    if AktPos = EndPos; // Leerfeld
    AktPos = EndPos + 1;
    else;
    MyField(Find) = %subst(Source:AktPos:EndPos-AktPos);
    endif;
    AktPos = EndPos + 1;
    Find += 1;
    endsl;

    next;


    Das Ganze erhebt keinen Anspruch auf Vollständigket.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  10. #10
    Registriert seit
    Jan 2001
    Beiträge
    850
    Hi,

    das hat mich doch stark interessiert.

    Meine Lösung wäre einfach ein kleines PHP progrämmle
    PHP-Code:
    <?php

    // folgender Aufbau
    //----------------------------------
    // """Text""";Text;1;1,98;"3;4";"A;B;""C"
    // "feld1";datenfeld2;1500,99;feld4;"feld5";"120,99;5%"
    //
    //------------------------------------
    echo('Hello CSV Import ');

    ini_set('auto_detect_line_endings',TRUE);

    $handle fopen('/a/testcsv.txt','r');
    while ( (
    $data fgetcsv($handle1000';') ) !== FALSE ) {
        
        
    print_r($data);
    }
    ini_set('auto_detect_line_endings',FALSE);
    ?>
    und hier das Ergebnis:
    PHP-Code:
    Hello CSV Import Array
    (
        [
    0] => "Text"
        
    [1] => Text
        
    [2] => 1
        
    [3] => 1,98
        
    [4] => 3;4
        
    [5] => A;B;"C
    )
    Array
    (
        [0] => feld1
        [1] => datenfeld2
        [2] => 1500,99
        [3] => feld4
        [4] => feld5
        [5] => 120,99;5%

    Das war's läuft auf der i
    COOL oder

    Gruß
    Michael

  11. #11
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Hat mich doch noch der Ehrgeiz gepackt und da PHP vermutlich nicht so gefragt ist...

    Hier meine Lösung:
    Code:
    D pos             s             10i 0 inz(0)                              
    D ix              s             10i 0 inz(0)                              
    D Ara             s             50a   varying dim(99)                     
    D src             s           5000a   inz('"""Text""";Text;1;1,98;"3;4";+ 
    D                                     "A;B;""C"')                         
     /free                                                                    
            src = %trimr(src) + ';';      // set end mark                     
     
            dow src > *blanks;                                                
              if %subst(src:1:1) = '"' and %subst(src:1:2) <> '""'; 
                pos = %scan('";':src);                                        
                if %subst(src:pos+1:2) = '""';                                
                  dou %subst(src:pos+1:2) <> '""';                            
                    pos = %scan('";':src:pos+1);                              
                  enddo;                                                      
                endif;                                                        
              pos += 1;                                                       
              else;                                                           
              pos = %scan(';':src);
              endif;
     
              if pos > 1;                          
                ix += 1;       
                ara(ix) = %trimr(%subst(src:1:pos-1));   
                if %subst(ara(ix):1:1) = '"';               // cleanup 
                  ara(ix) = %replace('':Ara(ix):1:1);                    
                  ara(ix) = %replace('':Ara(ix):%len(ara(ix)):1);   
                endif;                                      
                src = %subst(src:pos+1);                 // shift  
              endif;               
            enddo;    
     
         Ara = %scanrpl('""':'"':Ara);                      // ab V7R1
     
     /end-free
    Erstaunlicherweise funktioniert sie auch ;-)

    Alle Angaben ohne Gewähr (wie eine Lottopanne lehrt)
    kf

  12. #12
    Registriert seit
    Apr 2003
    Beiträge
    195
    Ehrlich, ihr seid der Wahnsinn,

    so schnell so viele Lösungsansätze, dass ich kaum mit dem Lesen und Grüblen nachkomme

    Danke euch allen für die vielen Vorschläge. Ich werde mich jetzt daranmachen und sie der Reihe nach durchprobieren.

    Nochmals recht herzlichen Dank!

    Franz-Georg

Similar Threads

  1. QSH Ausgabe einer CSV Datei in eine DATAQ
    By iseries_user in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 21-09-12, 14:53
  2. Wert aus CSV Datei
    By mk in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 21-12-06, 08:56
  3. encoding file system system von CSV files
    By cc in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 13-10-04, 22:52
  4. EXCEL, PDF, CSV... aud Spools & Dateien generieren
    By Kilianski in forum NEWSboard Server Software
    Antworten: 0
    Letzter Beitrag: 27-05-04, 14:13
  5. EXCEL, PDF, CSV... aus Spools & Dateien generieren
    By Kilianski in forum Archiv NEWSblibs
    Antworten: 0
    Letzter Beitrag: 27-05-04, 14:10

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •