[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    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

  2. #2
    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

  3. #3
    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

  4. #4
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Franz-Georg,

    noch kurz einige Erklärungen, damit Du nicht zuviel Grüblen musst.

    Der erste Teil dient dem Verfizieren der Endposition. Sollte ein Wert mit " beginnen, ist zu prüfen ob es eine Konstante oder ein Feld mit entsprechendem Separator ("; ist.

    Wurde die Feldendposition bestimmt, erfolgt ein Substring in den Array mit einem ersten Cleanup vom " (nur einstellig). Damit wären Felder wie "3;4" von diesen Zeichen befreit.

    Der Shift entfernt den bearbeiteten Wert aus dem String. Heisst, der String wird solange abgearbeitet , bis nix mehr da ist.

    Am Schluss reduziert der %scanrpl das "" Zeichen auf ein Einzelnes (Erstes und letztes Feld). Dies funktioniert nur in V7R1, ansonsten eine Schleife mit %%scan/%replace.

    Hoffe, dies hilft.
    kf

  5. #5
    Registriert seit
    Apr 2003
    Beiträge
    195
    Hallo,

    so mit dem ersten Ergebnis zurück, aber leider gleich einen kleinen Dämpfer für Camouflage: Was passiert, wenn, wie natürlich auch möglich, hinter einem ; erneut ein ; kommt, da das entsprechende Feld keinen Wert enthält?

    Durch die Abfrage pos > 1 wird genau dies nicht erfasst und es kommt zu einem Dauerloop.

    LG
    Franz-Georg

  6. #6
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Hi,

    Ist schon klar, aber auf die Schnelle hab ich nicht alle Fälle eingebaut...

    Wollte Dir ja auch noch was überlassen
    kf

  7. #7
    Registriert seit
    Jan 2007
    Beiträge
    1.002
    Sonst kannst Du den Code so ergänzen:

    Code:
     if pos >= 1;                                  
       ix += 1;                                    
       if pos = 1;                                 
         ara(ix) = *blanks;                        
       else;                                       
         ara(ix) = %trimr(%subst(src:1:pos-1));    
       endif;
    ok?
    kf

  8. #8
    Registriert seit
    Apr 2003
    Beiträge
    195
    na ja wenn schon jemand so eine Lösung auf die
    Schnelle anbietet wird man natürlich denkfaul

    danke nochmal für die superlösung.

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
  •