Ankündigung

Einklappen
Keine Ankündigung bisher.

Array - csv

Einklappen

Neue Werbung 2019

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

  • Array - csv

    hallo,

    ich habe mittels php ein csv file geöffnet und möchte dieses dann an eine mssql datenbank weitergeben. meine ersten schritte waren, das csv in eine optisch bessere form zu bringen, auch die spaltenbezeichnung habe ich aus der 1. zeile ausgelesen.

    mein problem ist nun, dass ich nicht weiss wie ich das array schreiben muss, um z.b. ein insert mit sql zu starten. ich weiss eben nicht, wie ich zusätzlich zur zeile auch die spalte in ein array bekomme bzw. aus dem array auslese. anbei der aktuelle code...

    PHP-Code:
    <?
    $seperator = ";";
    $file = "test.csv";
    $lines = file($file);
    $numlines = count($lines);

    //1. Zeile als Spaltenbezeichnung auslesen[0]
    $header = explode($seperator, $lines[0]);

    //Anzahl der Spalten
    $numh = count($header);
    $i = 0;

    //Output formatieren
    echo "<table border = 1 cellpadding = 2><tr>";

    while($i<$numh){
           $header = str_replace("\"", "", $header);
           echo "<td>".$header[$i]."</td>";
           $i++;
           }

    echo "</tr>";
    $y = 1;

    while($y<$numlines){
           $x=0;
           echo "<TR>";
                   while($x<$numh){
                   $fields = explode($seperator, $lines[$y]);
                   $fields = str_replace("\"", "", $fields);
                   echo "<TD>".$fields[$x]." </TD>";
                   $x++;
                           }
           $y++;
           echo "</TR>";
           }

    echo "</table>";
    ?>
    vielen dank schon im voraus,

    lg schnurzli


  • #2
    villeicht muss ich meine frage anders stellen....

    wie kann ich die 1. zeile des cvs-files hernehmen als spaltenbezeichnung und damit die darunterleigenden spalten in einem array abbilden?
    bsp:

    test.csv:

    name;telefonnummer;geburtsdatum
    name1;telefon1;geb1;
    name2;tel2;geb2

    und jetzt möchte ich dies mit einem insert in eine sql datenbank spielen.
    zb.: tabelle "personen"

    das heisst ich möchte in der vorhandenen tabelle personen mit den feldern name, telefonnummer und geburtsdatum aus der csv datei auslesen und in sql speichern.

    das heisst ich muss php irgendwie sagen, dass immer der 1. string in jeder zeile in die sql-zeile name kommt. usw....

    gibt es da eine lösung?

    Kommentar


    • #3
      Dafür gibts ja die schöne Funktion fgetcsv() (http://de3.php.net/manual/de/function.fgetcsv.php).
      Damit kannst du dir die ganze manuelle Aufsplitterei sparen. Der folgende Ausschnitt gibt dir die Daten aus und
      schreibt sie gleich auch noch in die DB:
      PHP-Code:
      // DB-Connect
      $seperator ";";
      $file "test.csv";

      $fh fopen($file'r');
      $header fgetcsv($fp1024$seperator'"');
      echo 
      "<table>\n";                                                             // nur für Ausgabe
      echo "<tr><th>" implode('</th><th>' $header) . "</th></tr>\n";   // Ausgage Kopfzeile
      $fields implode(', '$header);
      while(list(
      $name$tel$geb) = fgetcsv($fp1024$seperator'"')){                          // Zeile 10
          
      echo "<tr><td>$name</td><td>$tel</td>$geb<td></td></tr>\n";               // Ausgabe Zeilen
          
      $sql "INSERT INTO personen ($fields)
                    VALUES('
      $name', '$tel', '" implode('-'array_reverse(explode('.'$geb))) . "')";       // Zeile 13
          
      mysql_query($sql) or die("Fehler: " mysql_error() . "
      $sql
      "
      ;
      }
      echo 
      "</table>\n";                                                            // nur für Ausgabe
      fclose($fp); 
      Falls nicht immer gleich viele Felder in der CSV-Datei sind, kannst du die Zeilen 10 und 13 durch folgende ersetzen:
      PHP-Code:
      ...
      while(
      $zeile fgetcsv($fp1024$seperator'"')){   // Zeile 10
      ...
                  
      VALUES('" . implode("'', $zeile) . "')";        // Zeile 13 
      Allerdings musst du dann allfällige Datumsfelder vorher ins Datenbankformat umwandeln
      Gruss
      L

      Kommentar


      • #4
        vielen dank für deine hilfe. ich hbae jetzt ein verständnisproblem...
        bei fgetcsv ist ja amende '"' dran - das ist der string enclosure- nur steht im phptu keine genaue beschreibung. was macht dieser enclosure?


        der leicht abgeänderte code unten gibt nur den die 1. zeile aus. wie kann ich denn den gesamten datensatz ausgeben? wie erkennt php was header und was die felder sind . der code unterscheidet sich ja nicht
        muss ich mir bei den zeilen mit count() in while() weiterhelfen?

        PHP-Code:
        <?
        include ("config.php");
        $fp = fopen($file, 'r'); 
        $header = fgetcsv($fp, 1024, $seperator, '"'); 
        echo implode(' | ' , $header);
        $fields = implode(', ', $header); 
        while($zeile = fgetcsv($fp, 1024, $seperator, '"')){
        echo $zeile;

        //$sql = ("INSERT INTO hperson ($fields) VALUES();   // Zeile 13 
        //mssql_query($sql) or die("database insert failed:" . mssql_error() . "
        $sql
        "; 

        fclose($fp);
        ?>

        Kommentar


        • #5
          Da $zeile ein Array ist, musst du ihn entsprechend ausgeben, z. B. wie $header. Da muss bei meinem Code natürlich auch noch Zeile 11 angepasst werden:
          PHP-Code:
          echo "<tr><td>" .  implode('</td><td>'$zeile) . "</td></tr>\n";               // Ausgabe Zeilen 
          Und das enclosure ist das Zeichen, in dem Strings eingeschlossen sind (bzw. sein können).
          PHP erkennt nicht, was Header ist, und was nicht. Das musst du schon selber steuern. Allerdings steht der Header ja normalerweise in der ersten Zeile.
          Gruss
          L

          Kommentar


          • #6
            hi again,

            ichkonnte dank deiner ausführlichen hilfe alle probleme die ich gestern hatte lösen.

            nun habe ich ein weiteres...

            ich möchte in 3 verschiedene tabellen ein insert starten.

            also das csv ist wie gehabt - hat 10 spalten.

            die ersten 5 spalten möchte ich in die tabelle "person"
            die spalte 5-7 möchte ich dann in die tabelle "hobbies"
            die restlichen in eine tabelle "optional"

            wie kann ich jetzt $fields so aufteilen, dass ich 3 inserts sarten kann.

            bisher hatte ich das problem, dass mit

            PHP-Code:
            INSERT INTO person ($fieldsVALUES('$regtime''$birthdate''$LastName''$FirstName' 
            immer ein fehler kam, das die natürlich insert mit value nicht übereinstimmt....

            Kommentar


            • #7
              Zitat von schnurzli
              wie kann ich jetzt $fields so aufteilen, dass ich 3 inserts sarten kann.
              Was steht in $fields? Wenn du drei Einträge in unterschiedlichen Tabellen vornehmen möchtest, musst du auch drei entsprechende INSERT-Abfragen abschicken.

              Kommentar


              • #8
                in $fields steht die 1. zeile des csv-files. alsodie spaltenbezeichnungen.
                das sind in summe 10 stück.

                jetzt möchte ichaber 3 INSERT-Abfragen starten. die1. mit den ersten 5 spalten aus der csv,der 2 mit der 6.spalte und die 3. mit demrest....

                Kommentar


                • #9
                  Zitat von schnurzli
                  in $fields steht die 1. zeile des csv-files. alsodie spaltenbezeichnungen.
                  das sind in summe 10 stück.
                  jetzt möchte ichaber 3 INSERT-Abfragen starten. die1. mit den ersten 5 spalten aus der csv,der 2 mit der 6.spalte und die 3. mit demrest....
                  Dann greif dir dafür doch einfach über den entsprechenden Schlüssel den Wert des gewünschten Feldes oder benutze array_slice(), um bestimmte Teile aus dem Array zu ziehen.

                  Kommentar


                  • #10
                    also ich habs jetzt mit array_slice probiert. die ausgaba passt aber ich glaube icgrendetwas passt mit der while-schleife nicht überein.

                    PHP-Code:
                    include ("config.php");
                    $fp fopen($file'r'); 
                    $header fgetcsv($fp1024$seperator'"'); 
                    echo 
                    "<table>\n";
                    echo 
                    "<tr><th>" implode('</th><th>' $header) . "</th></tr>\n";
                    //$fields = implode(', ', $header);
                    $person1 array_slice ($header05);
                    $hobbies array_slice ($header61);
                    $optional array_slice ($header73);
                    while(
                    $zeile fgetcsv($fp1024$seperator'"')){
                    echo 
                    implode(', '$person);
                    //echo "<tr><td>" .  implode('</td><td>', $zeile) . "</td></tr>\n";
                    $personen "INSERT INTO person ($person1) VALUES('" implode("','"$zeile) . "')";
                    mssql_query($personen) or die("database insert failed:" mssql_error() ."");

                    liegt es an:
                    PHP-Code:
                    fgetcsv($fp1024$seperator'"'
                    in der while schleife? was könnte ich da anders machen?

                    Kommentar


                    • #11
                      Zitat von schnurzli
                      aber ich glaube icgrendetwas passt mit der while-schleife nicht überein.
                      Das machst du woran fest?

                      Zitat von schnurzli
                      PHP-Code:
                      $header fgetcsv($fp1024$seperator'"'); 
                      Wo kommt $seperator her?

                      Zitat von schnurzli
                      PHP-Code:
                      echo implode(', '$person); 
                      Wo kommt $person her?

                      Kommentar


                      • #12
                        Nur am Rande: es heißt Separator.

                        Kommentar


                        • #13
                          @ zergling: ist ja zum glück nur eine bemerkung am rande hauptsache die variable ist immer gleich.

                          @xabbuh: $seperator kommt aus der config.php. dort hab ichs definiert.
                          ist einfach das trennzeichen im csv-file. also: .[php$seperator = ";";][/php]

                          PHP-Code:
                          echo impode(', '$person); 
                          hatte nur testzwecke. hab vergessen es auszukommentieren

                          Kommentar


                          • #14
                            Und woran machst du jetzt fest. dass deine while-Schleife nicht richtig funktioniert?

                            Kommentar


                            • #15
                              also - mein problem ist:

                              ich versuche mit dem insert die csv-datei in eine sql datenbank zu importieren.

                              dann gibt mir der browser zurück, dass die anzahl der inserts nicht mit der anzahl der values übereinstimmt!

                              somit ist meine schlussfolgerung, dass nun zwar der gewünschte header aus der csv-datei ausgelesen wird, jedoch im values lade ich ja das gesamte csv-file mit allen spalten ein. somit passt es nicht überein.

                              hab ich das richtig erklärt?

                              Kommentar

                              Lädt...
                              X