Ankündigung

Einklappen
Keine Ankündigung bisher.

2 Arrays in FputCSV, Sonderzeichen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 2 Arrays in FputCSV, Sonderzeichen

    Guten Morgen,

    ich habe ein etwas komplizierteres Problem:

    Ich bastel mir ein Statement, packe die Ergebnisse in einen Array und möchte diesen jetzt in eine CSV Datei schreiben. Hier mal etwas Code:

    PHP-Code:
    // CSV EXPORT                            
    if(isset($_POST['csvdownload'])){
     while( 
    $obj sqlsrv_fetch_object($tbquery)) {
      
    $header = array('CV01.2','VS00054400','',$datum_tabelle,$lnr,'','',$row_count,'');
      
    $daten = array('3000004225',$obj->A02,$obj->A03,$datum_tabelle,'',$obj->A06,'','','','011112',$obj->R02,$obj->R03,$obj->R04,$obj->R05,$obj->R06,'','','','','','','','','','','','','','','','',$obj->E01,$obj->E02,'',$obj->E04,$obj->E05,$obj->E06,utf8_encode($obj->E07),utf8_encode($obj->E08),$obj->E09,'',$obj->E11,$obj->E12,$obj->E13,$obj->E14,$obj->E15,$obj->E16,$obj->E17,'',$obj->E19,$obj->E20,'',$obj->E22,'','','','',$obj->E27,'','','','');
      
    $fp fopen($datum '-' $lnr '.txt''w');
      
    fputcsv($fp$datenchr(9));
     }
     }else{
    echo 
    'Export noch nicht gestartet';

    Der Aufbau der CSV soll nachher wie folgt aussehen:

    HEADER{Zeilenumbruch}
    DATEN{Zeilenumbruch}
    DATEN{Zeilenumbruch}
    DATEN{Zeilenumbruch}
    DATEN{Zeilenumbruch}
    DATEN{Zeilenumbruch}
    DATEN{Zeilenumbruch}
    ...
    ...
    ..

    Momentan sieht meine Datei aber wie folgt aus:

    DATEN (es wird mir nur 1 Datensatz ausgespuckt)

    Ich weiss jetzt nicht, wie ich den Headerarray mit reinbekomme und ich weiss auch nicht, warum mir in der while-Schleife nicht alle Ergebnisse, sondern nur das Erste ausgegeben wird. Den Query habe ich bereits überprüft, es sind 149 Zeilen, die mir ausgegeben werden müssten. Kann mir da jemand helfen?

    Vielen Dank!
    Brontalos Multigaming


  • #2
    Hi,

    fopen (und fclose) müssen außerhalb der Schleife platziert werden, sonst überschreibst du ja bei jedem Durchlauf dein CSV.

    Erst Datei aufmachen
    Dann Datensätze mit Schleife durchlaufen
    Beim ersten Schleifendurchlauf den Header schreiben
    Beim ersten und bei allen anderen Schleifendurchläufen Daten ins CSV schreiben
    Am Ende Datei schliessen
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      Super!

      Super, das hat schonmal funktioniert

      Ich habe jetzt den Header, einen Zeilenumbruch und dann meinen Schleifeninhalt schön untereinander weg.

      2 Dinge, die mir noch ein Rätsel sind:

      - ganz am Ende habe ich eine Zeile, die allerdings komplett leer ist. Warum?
      - der Zeichensatz muss zu Windows 1252 konvertiert werden.... jemand eine Idee, wie ich das für meinen Array umsetzen kann?
      Brontalos Multigaming

      Kommentar


      • #4
        Hi,

        soweit ich weiß fügt fputcsv() einen Zeilenumbruch hinzu. Warum ist das problematisch für dich?

        Bezüglich Zeichensatzkonvertierung. Was hast du denn versucht? Und zeig mal dein bisheriges Skript.
        "Mein Name ist Lohse, ich kaufe hier ein."

        Kommentar


        • #5
          Zitat von Chriz Beitrag anzeigen
          Hi,

          soweit ich weiß fügt fputcsv() einen Zeilenumbruch hinzu. Warum ist das problematisch für dich?

          Bezüglich Zeichensatzkonvertierung. Was hast du denn versucht? Und zeig mal dein bisheriges Skript.
          der Zeilenumbruch stellte sich als 'leerer' Datensatz heraus. Das Problem ist, das ein Zeilenumbruch am Ende meiner Datei einen Fehler beim Import in das Drittsystem verursacht - aber 1x öffnen und am Ende den Zeilenumbruch kontrollieren kann ich dann auch händisch machen wobei bei meinen letzten Testläufen kein Umbruch mehr zu sehen war.

          ZU DER CODIERUNG/ZEICHENSATZ

          Die Daten liegen in der Sortierung 'Latin1_General_CI_AS' in einer MSSQL vor, dort hole ich sie mir ab.

          das ist mein Code:

          PHP-Code:
          // QUERY MUSS dekodiert an die Datenbank übergeben werden, damit der Zeichensatz für die DB richtig ist!!!
          $tbsql utf8_decode("
              SELECT 
              CSTM_Telefonbuch.ID AS A02, 
              CSTM_Telefonbuch.msnID AS msnid, 
              CSTM_Telefonbuch.DatensatzID AS A03, 
              CSTM_Telefonbuch.validFrom AS A04, 
              CSTM_Telefonbuch.validto AS validto, 
              CSTM_Telefonbuch.A06_Auftragsart AS A06, 
              CSTM_Telefonbuch.R_Länderkennzahl AS R02, 
              CSTM_Telefonbuch.R_KennZahl AS R03, 
              CSTM_Telefonbuch.R_MSN AS R04, 
              CSTM_Telefonbuch.R_Zentrale AS R05, 
              CSTM_Telefonbuch.R_Nebenstelle AS R06, 
              CSTM_Telefonbuch.E_Beruf_Geschäft AS E01, 
              CSTM_Telefonbuch.E_Nutzung AS E02, 
              CSTM_Telefonbuch.E_Nutzung_Print E04, 
              CSTM_Telefonbuch.E_Nutzung_Elektronik AS E05, 
              CSTM_Telefonbuch.E_Nutzung_Auskunft AS E06, 
              CSTM_Telefonbuch.E_Name AS E07, 
              CSTM_Telefonbuch.E_Vorname AS E08, 
              CSTM_Telefonbuch.E_Vorsatzwort AS E09, 
              CSTM_Telefonbuch.E_Titel AS E11, 
              CSTM_Telefonbuch.E_Strasse AS E12, 
              CSTM_Telefonbuch.E_Hausnummer AS E13,
              CSTM_Telefonbuch.E_Hausnummerzusatz E14, 
              CSTM_Telefonbuch.E_Postleitzahl AS E15, 
              CSTM_Telefonbuch.E_Ortsname AS E16, 
              CSTM_Telefonbuch.E_Ortszusatz AS E17, 
              CSTM_Telefonbuch.E19_Suchverzeichniss AS E19, 
              CSTM_Telefonbuch.E20_InverseSuche AS E20, 
              CSTM_Telefonbuch.E22_KzAdresse AS E22, 
              CSTM_Telefonbuch.E27_KomplexKz AS E27, 
              Adressen.Sperrvermerk 
                  FROM 
                      organice.dbo.CSTM_Telefonbuch CSTM_Telefonbuch, 
                      organice.dbo.el_MSN el_MSN, 
                      organice.dbo.el_Product el_Product, 
                      organice.dbo.Adressen Adressen 
                  WHERE 
                      CSTM_Telefonbuch.msnID = el_MSN.ID 
                      AND 
                      el_MSN.ProductID = el_Product.ID 
                      AND 
                      el_Product.AdressID = Adressen.ID 
                      AND 
                      CSTM_Telefonbuch.DatensatzID LIKE '' 
                      AND 
                      CSTM_Telefonbuch.validFrom <= '" 
          $datum "' 
                      AND 
                      CSTM_Telefonbuch.A06_Auftragsart LIKE 'a' 
                      AND 
                      Adressen.Sperrvermerk LIKE '' 
                  ORDER BY 
                      CSTM_Telefonbuch.E_Name ASC"
          );

          include(
          'config.php');

          // Query 
          $params = array();
          $options = array("Scrollable" => "static");//Den Zeiger auf statisch setzen, damit die Zählfunktion läuft


          $tbquery sqlsrv_query($pconn$tbsql$params$options);# Query ausführen


          // Prüfung, ob Statement vernünftig ausgeführt wird
           
          if( $tbquery === false ) {
            die( 
          print_rsqlsrv_errors(), true));
           }

          //Zeilen zählen
          $row_count sqlsrv_num_rows$tbquery );



          // CSV EXPORT

          # Dateinamen bestimmen (datum-laufendenummer.txt)
          $dateiname $datum '-' $lnr '.txt';

          #wenn Download CSV geklickt wird, dann
              
          if(isset($_GET['submit'])){

                  
          //Datei mit aktuellem Datum und der laufenden Nummer erzeugen
                  
          $fp fopen($datum '-' $lnr '.txt''w');


                  
          //Statische Headerdaten (NICHT PHP HEADER), die dynamisch erzeugt werden
                  
          $header = array('CV01.2','VS00054400','',$datum_tabelle,$lnr,'','',$row_count,'');

                  
          //Den Header VOR der Whileschleife schreiben, da er sonst vor jeder Zeile des Ergebnisarrays wiederholt wird
                  //erst die Textdatei erzeugen und den Header Schreiben, dann die While-Schleife
                  
          fputcsv($fp$headerchr(9));

                  
          //jetzt erst die While-schleife starten und die Daten aus der Datenbank holen
                  
          while( $obj sqlsrv_fetch_object($tbquery)) {


                  
          # nun innerhalb der While-Schleife die Daten für den Export in einen Array packen
                  
          $daten = array('3000004225',$obj->A02,$obj->A03,$datum_tabelle,'',$obj->A06,'','','','011112',$obj->R02,$obj->R03,$obj->R04,$obj->R05,$obj->R06,'','','','','','','','','','','','','','','','',$obj->E01,$obj->E02,'',$obj->E04,$obj->E05,$obj->E06,utf8_encode($obj->E07),utf8_encode($obj->E08),$obj->E09,'',$obj->E11,$obj->E12,$obj->E13,$obj->E14,$obj->E15,$obj->E16,$obj->E17,'',$obj->E19,$obj->E20,'',$obj->E22,'','','','',$obj->E27,'','','','');


                  
          # Daten in die Textdatei schreiben
                  
          fputcsv($fpstr_replace('"'''$daten), chr(9));
                  }
          //While-Ende

                  //Datei schließen
                  
          fclose($fp);

              
          //Wenn noch kein Export angestossen wurde, kurze Textinfo ausgeben
              
          }else{
              echo 
          '
                  <div class="alert alert-info alert-dismissable">
                      <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
                      Textdatei wurde noch nicht erzeugt. Bitte auf \'CSV Datei herunterladen\' klicken, um die Meldedatei zu erzeugen.
                  </div>'
          ;
          }
          # /wenn Download CSV geklickt wird 
          ich hab den Code mal im Ursprungsformat (funktionsfähig) gepostet.

          WAS ICH BEREITS PROBIERT HABE

          ich habe versucht, die Ausgabe für fputcsv() mit iconv() zu konvertieren.... bin jedoch gescheitert.

          WEITERES PHÄNOMEN

          Ich habe sporadisch mal Anführungszeichen bei Namen oder Straßennamen, kann mir jedoch nicht erklären, wo die herstammen. Es ist aber nicht in jeder Zeile, sondern nur bei einigen Zeilen mit den Anführungszeichen so.
          Brontalos Multigaming

          Kommentar


          • #6
            Du musst dein Zeichensatzproblem konsequent lösen.

            Wenn du Daten in ISO-8859-1(5) hast, deine Sourcefiles in UTF8 und die Datenbank wieder in LATIN, dann musst du das klar stellen. Ich würde in den Sourcefiles zumindest in UTF8 blaiben. Hast du für die Kommunikation mit der DB mal PDO versucht? Da kannst du bei der Verbindung zum Server einen Zeichensatz angeben. Dadurch werden die Daten bei der Kommunikation mit der DB übersetzt. iconv und co nicht notwendg. Die Daten aus der CSV-Datei musst du dann aber konvertieren. Vom Prinzip her:

            PHP-Code:
            $line array_map('utf8_encode'$line);
            fputcsv($fp$line, ...); 
            Ich habe keinen MSSQL-Server zum Testen hier, aber das müsste an sich funktionieren.
            Standards - Best Practices - AwesomePHP - Guideline für WebApps

            Kommentar


            • #7
              Zitat von rkr Beitrag anzeigen
              Du musst dein Zeichensatzproblem konsequent lösen.

              Wenn du Daten in ISO-8859-1(5) hast, deine Sourcefiles in UTF8 und die Datenbank wieder in LATIN, dann musst du das klar stellen. Ich würde in den Sourcefiles zumindest in UTF8 blaiben. Hast du für die Kommunikation mit der DB mal PDO versucht? Da kannst du bei der Verbindung zum Server einen Zeichensatz angeben. Dadurch werden die Daten bei der Kommunikation mit der DB übersetzt. iconv und co nicht notwendg. Die Daten aus der CSV-Datei musst du dann aber konvertieren. Vom Prinzip her:

              PHP-Code:
              $line array_map('utf8_encode'$line);
              fputcsv($fp$line, ...); 
              Ich habe keinen MSSQL-Server zum Testen hier, aber das müsste an sich funktionieren.
              Danke für deine Hilfestellung. Es hat insofern funktioniert, das ich jetzt die Datei im UNIX Zeichensatz mit UTF-8 Kodierung vorliegen habe. Ich brauche aber den Dos\Windows Zeichensatz mit ANSI Kodierung (Bezeichnungen aus Notepad++ übernommen, unten rechts in der Statusleiste). Solch eine Datei möchte ich erzeugen.

              Zur Datenbank: Ich muss leider mit der DB so arbeiten, wie sie ist. Den PDO-Treiber wollte ich auch anfangs nutzen, aber es gibt noch keinen kompilierten Treiber für PHP 5.5 (verbessert mich, wenn es mittlerweile einen gibt), deshalb musste ich mich mit dem sqlsrv - Treiber zufrieden geben, wobei selbst der inoffiziell kompiliert ist, jedoch im Microsoft Support Forum angeboten wird.

              Naja, leidtragender bin dann ich, der mit der Datei rumhantieren muss -.-

              Any idea, wie ich das mit dem Zeichensatz und der Kodierung so hinbekomme?
              Brontalos Multigaming

              Kommentar

              Lädt...
              X