Mit einer CSV 2 Tabellen füttern

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

  • Mit einer CSV 2 Tabellen füttern

    Hallo liebe Community,

    es dreht sich alles wieder mal um CSV's. Ich habe eine CSV, die ich die MySQL Datenbank verfrachte. Funktioniert soweit wie geplant. Nun hab ich ein anderes Problem. Wie kann ich denn anstellen, dass aus einer CSV zwei SQL Tabellen gefüllt werden?

    Bsp.:
    1. Teil der CSV sind die Daten
    2. Teil der CSV sind die Bilder

    Da die Bilder in einer separaten Tabelle aufgeführt sein müssen, muss es in dieser Art eine Möglichkeit geben. Da die Bilder dann über die ID aus der ersten Tabelle verknüpft werden, habe ich mir gedacht, dass man mysql_insert_id dazu missbrauchen könnte.

    Hoffe, dass ihr mir helfen könnt.


    PS: Das hier ist mein Import in die DB

    PHP-Code:
    for ($i 0$i sizeof($fcontents); $i++)
    {
        
    $line trim($fcontents[$i]);
        echo 
    "<tr bgcolor=\"#D3D3D3\"><td colspan=\"3\">$line <br></td></tr>";
        
    $arr explode(";" $line);
        
    #Wenn die CSV Datei TAB separiert ist, muss ";" durch "/t" ersetzt werden
        
    $sql "insert into ".$sqltabelle." values ('"implode("','",$arr) ."')";
         
    mysql_query($sql);

        echo 
    "<tr bgcolor=\"#32CD32\"><td colspan=\"3\">" $sql "<br>\n</td></tr>";
        
        if(
    mysql_error())
        {
            echo 
    "<tr bgcolor=\"red\"><td colspan=\"3\">" mysql_error() . "<br>\n</td></tr>";
        }

    Mit freundlichen Grüßen

    Euer sk4r
    Zuletzt geändert von sk4r; 11.10.2006, 13:44.
    Höre nie auf zu versuchen. Versuche nicht aufzuhören.

  • #2
    Hmm kann denn keiner die Katze ausm Sack lassen?
    Die PHP-Manual Seite wird mich bald verklagen, da ich zu hohen Traffic verursache, weil ich nur am Suchen bin und trotzdem net finde.

    Hab ich Tomaten auf den Augen oder gibt es soetwas nicht?
    Höre nie auf zu versuchen. Versuche nicht aufzuhören.

    Kommentar


    • #3
      Re: Mit einer CSV 2 Tabellen füttern

      Alles noch zu ungenau, um darauf präzise Antworten zu können ...

      1. Teil der CSV sind die Daten
      2. Teil der CSV sind die Bilder
      D.h., erster Datensatz aus erstem Teil gehört zu erstem Datensatz aus zweitem Teil, zweiter zu zweitem, etc. ...?


      Dann würde ich aus der einen csv-Datei zwei machen, und beide parallel einlesen. Ersten Datensatz INSERTen, ID ermitteln, und damit Bilderdatensatz INSERTen, etc. pp.

      Kann man natürlich auch ohne Trennen der Daten machen, wenn man zuerst alles in zwei interne Arrays o.ä. einliest - und dann diese Satz für Satz abarbeitet.

      Sollte aber klar sein, dass dieses Verfahren extrem fehleranfällig ist - wenn die Daten nicht 1:1 zueinander passen, wird's zwangsläufig Murks geben.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        Hm das ist eine gute Idee für meine vorläufige Überlegung gewesen.

        Nein, ich glaube, dass ich es falsch erklärt habe.

        Also:

        ID Name Username Passwort Bild
        1 huhu huhuhu 123 test.jpg



        So nun soll ID,Name,Username und Passwort in die Tabelle "benutzer" und Bild in die Tabelle "bilder", wobei "benutzer_ID" mit an die "bilder" Tabelle übergeben wird.
        Höre nie auf zu versuchen. Versuche nicht aufzuhören.

        Kommentar


        • #5
          Hi,
          ja warum machst du es denn nicht einfach ?
          Genau so wie dus gesagt hast. Das sind zwei queries je zeile der datei.

          greets
          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

          Kommentar


          • #6
            Original geschrieben von closure
            Hi,
            ja warum machst du es denn nicht einfach ?
            Genau so wie dus gesagt hast. Das sind zwei queries je zeile der datei.

            greets
            Hmm leider hab ich dein Posting nicht so ganz verstanden, aber ich glaube, dass du das richtige meinst. Ich möchte 2 querrys machen und den einen in die eine Tabelle schiffen und die andere in die andere Tabelle. Nur wie mach ich das?
            Höre nie auf zu versuchen. Versuche nicht aufzuhören.

            Kommentar


            • #7
              Original geschrieben von sk4r
              Ich möchte 2 querrys machen und den einen in die eine Tabelle schiffen und die andere in die andere Tabelle. Nur wie mach ich das?
              In dem du zwei Queries machst, und den einen Teil des Datensatzes in die eine Tabelle einfügst, und den anderen in die andere.

              Und wenn du nach der ersten Query die erzeugte ID wissen und sie in der zweiten Query für irgendeinen Spalteninhalt einsetzen möchtest, dann benutzt du zwischendurch das bereits erwähnte mysql_insert_id.


              Ja, das ist eigentlich genau so simpel wie's klingt.
              Wenn's dir trotzdem nicht gelingt, dann stelle bitte konkrete Fragen - aber erspare uns bitte weitere Aufgüsse des immer gleichen "und wie mach ich das?".
              I don't believe in rebirth. Actually, I never did in my whole lives.

              Kommentar


              • #8
                Ja genau so hab ich das auch verstanden. Es ist nicht so, dass ich null Ahnung von PHP und SQL hätte. Ich weiß auch wie man Queries macht. Aber wie man 2 Queries aus einer Zeile macht, weiß ich immer noch nicht. Hab schon das halbe WWW durchforstet.
                Höre nie auf zu versuchen. Versuche nicht aufzuhören.

                Kommentar


                • #9
                  Original geschrieben von sk4r
                  Ich weiß auch wie man Queries macht. Aber wie man 2 Queries aus einer Zeile macht, weiß ich immer noch nicht.
                  Du musst doch nur die Daten aufteilen - Element 0 bis x baust du in die eine Query ein, und x+1 bis y in die andere.


                  Wenn dir dazu keine dynamische Lösung wie im Beispielcode einfällt, dann mach's halt statisch. (Das Format der csv-Daten müsste dir ja sowieso bekannt sein, denn bei unbekanntem könntest du ja sowieso nicht einfach alles in eine Tabelle mit fester Spaltenzahl einfügen.)
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Ja soweit hab ich auch schon was im WWW gefunden. Aber das Problem bei deinem Ansatz ist doch, dass ich Zeilenweise schreibe und nicht Spaltenweise. Ich finde kein TUT dazu, sonst hätte ich schon selbst was getüftelt.. Nun hab ich durch meine Versuche schon meine Datenbank zerschossen. Naja Backup machts möglich..

                    Kennst du vllt nen Link, wo ich ein ähnliches Tutorial finde?
                    Höre nie auf zu versuchen. Versuche nicht aufzuhören.

                    Kommentar


                    • #11
                      Original geschrieben von sk4r
                      Aber das Problem bei deinem Ansatz ist doch, dass ich Zeilenweise schreibe und nicht Spaltenweise.
                      Wie meinen?

                      Du liest eine Zeile aus, die hat alle Werte, die du benötigst, in ihren Spalten.
                      Also nimmst du die Werte aus diesen Spalten, machst damit zwei Inserts - und dann geht's mit der nächsten Zeile weiter.

                      Du denkst viel zu kompliziert.
                      I don't believe in rebirth. Actually, I never did in my whole lives.

                      Kommentar


                      • #12
                        Hi,
                        der einfachheit halber gehen wir mal von einer csv-datei mit
                        folgendem format aus

                        benutzername;name;nachname;email;bildpfad

                        Ok, weiter konstruieren wir ein einfaches datenbankschema.
                        Es gibt zwei tabellen: "user" und "userdetail". (Über den sinn
                        bitte nicht diskutieren).

                        Semantisch, das heisst von der bedeutung her, gehören userdetails
                        zu einem user. Man hat also eine 1:n-beziehung.
                        Das modelliert man in dem man userdetail einen fremdschlüssel
                        verpasst, nämlich die id des users. Ok das hast du dir in deinem
                        konkreten fall ja alles auch schon richtig gedacht.

                        Folgender code soll den benutzternamen in die
                        tabelle user eintragen und die benutzerdetails in die tabelle userdetail.

                        Beispielhaft sieht die datei folgendermaßen aus:
                        Code:
                        johny;john;doe;johndoe@foobar.com;/pictures/john.png
                        bobby;bob;tail;bobtail@baz.com;/pictures/bob.png
                        pauly;paul;anchor;paulanchor@gilmore.org;/pictures/paul.png
                        Bearbeitung:
                        PHP-Code:
                        $content file('myusers.csv');
                        foreach(
                        $content as $row){
                              
                        $cols explode(';',$row);
                              
                        //erst den benutzer anlegen
                              
                        mysql_query("INSERT INTO `user` (username) VALUES('{$cols[0]}')",$db);
                              
                        //die id holen als fk für details
                              
                        $id mysql_insert_id($db);
                              
                        //und die details anlegen
                              
                        mysql_query("INSERT INTO `userdetail`
                              (name,nachname,email,bildpfad,user_id) VALUES
                               ('
                        {$cols[1]}','{$cols[2]}','{$cols[3]}','{$cols[4]}',{$id})",$db);
                              


                        Das wars auch schon.
                        Bitte übernimm das jetzt nicht 1 zu 1 und sag dann es geht nicht.
                        Das ist nur als anregung gedacht.
                        greets
                        (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                        Kommentar


                        • #13
                          @closure
                          genau soetwas hab ich mir auch gestern ausgedacht und geschrieben. leider bekomm ich keine meldung von mysql. was mich skeptisch macht ist, ob das hier

                          PHP-Code:
                          {$cols[1]}','{$cols[2]}','{$cols[3]}','{$cols[4]}',{$id} 
                          wirklich funktioniert.

                          PS:

                          Außerdem gibt es eine Fehlermeldung:

                          PHP-Code:
                          foreach($content as $row){
                                
                          $cols explode(';',$row);
                                
                          //erst den benutzer anlegen
                                
                          mysql_query("INSERT INTO `user` (username) VALUES('{$cols[0]}')",$db);
                                
                          //die id holen als fk für details
                                
                          $id mysql_insert_id($db);
                                
                          //und die details anlegen
                                
                          mysql_query("INSERT INTO `userdetail`
                                (name,nachname,email,bildpfad,user_id) VALUES
                                 ('
                          {$cols[1]}','{$cols[2]}','{$cols[3]}','{$cols[4]}',{$id})",$db);
                                

                          wäre das nicht auch mit ner "for"-Schleife möglich?
                          Zuletzt geändert von sk4r; 12.10.2006, 09:19.
                          Höre nie auf zu versuchen. Versuche nicht aufzuhören.

                          Kommentar


                          • #14
                            Original geschrieben von sk4r
                            leider bekomm ich keine meldung von mysql.
                            Du fragst ja auch überhaupt nicht danach.

                            Nutze mysql_error, um Fehler abzufragen, und nach INSERT/UPDATE/DELETE ggf. noch mysql_affected_rows.

                            Außerdem gibt es eine Fehlermeldung:
                            Und als ordentlicher Forendepp hält man sich natürlich an die eiserne Regel, diese unter keinen Umständen im Wortlaut zu nennen - gut gemacht!
                            I don't believe in rebirth. Actually, I never did in my whole lives.

                            Kommentar


                            • #15
                              nun hab ich das so gelöst.

                              PHP-Code:
                              for ($i 0$i sizeof($fcontents); $i++)
                              {

                                  
                              $line trim($fcontents[$i]);
                                  echo 
                              "<tr bgcolor=\"#D3D3D3\"><td colspan=\"3\">$line <br></td></tr>";
                                  
                              $arr explode(";" $line);
                                  
                              #Wenn die CSV Datei TAB separiert ist, muss "," durch "/t" ersetzt werden
                                  
                              mysql_query("INSERT INTO `printer` (id,printer_art_id,printer_kategorie_id,printer_druckgroesse_id,info,
                              info_aufloesung,name,hersteller,herst_art_nr,druckvolumen_mon,
                              formularsaetze,medienzufuhr,materialformate,materialablage,drucktechnik,
                              druckbreite,mediabreite,aufloesung,geraeuschentwicklung,geschwindigkeit,
                              snittstelle_parallel,snittstelle_LAN,snittstelle_USB,snittstelle_seriell,emulationen,
                              barcodes,arbeitsspeicher,flashspeicher,zusaetsl_infos,visibility,sort) VALUES('
                              {$cols[0]}','{$cols[1]}',
                              '
                              {$cols[2]}','{$cols[3]}','{$cols[4]}','{$cols[5]}',
                              '
                              {$cols[6]}','{$cols[7]}','{$cols[8]}','{$cols[9]}','{$cols[10]}','{$cols[11]}',
                              '
                              {$cols[12]}','{$cols[13]}','{$cols[14]}','{$cols[15]}','{$cols[16]}','{$cols[17]}',
                              '
                              {$cols[18]}','{$cols[19]}','{$cols[20]}','{$cols[21]}','{$cols[22]}','{$cols[23]}',
                              '
                              {$cols[24]}','{$cols[25]}','{$cols[26]}','{$cols[27]}','{$bid}','{$cols[29]}',
                              '
                              {$cols[30]}','{$cols[31]}','{$cols[32]}')");
                                  
                              $pid mysql_insert_id();
                                  
                              mysql_query("INSERT INTO `printer_pics` (id,printer_id,filename) VALUES ('{$cols[0]}','{$pid}','{$cols[28]}')");
                                  
                              //$sql = "replace into ".$sqltabelle." values ('". implode("','",$arr) ."')";
                                  
                              $bid mysql_insert_id();
                                  
                              #TABELLENNAME durch den Namen der Tabelle in der Datenbank ersetzen 
                              Soweit so gut. Aber nun beschreibt er mir die Tabelle "printer_pics" aber nicht die Tabelle "printer".

                              Ne Fehlermeldung kommt nun auch nicht wahsaga, da ich (so denke ich) alles richtig gemacht habe, bis auf den einen Insert-Befehl. Aber ich entdecke den Fehler nicht.
                              Höre nie auf zu versuchen. Versuche nicht aufzuhören.

                              Kommentar

                              Lädt...
                              X