Ankündigung

Einklappen
Keine Ankündigung bisher.

CSV-Datei in mehrere Teile aufspalten!?

Einklappen

Neue Werbung 2019

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

  • CSV-Datei in mehrere Teile aufspalten!?

    Hallo Leute,
    und wieder einmal hab ich ein Problem.
    Es geht darum eine rießige CSV-Datei in mehrere kleine aufzuteilen.
    Und zwar gibt es in dieser CSV-Datei auch ein Feld Bild.
    Jetzt soll es so sein, daß wenn Bilder vorhanden sind, die Datei
    alle 1200 Datensätze geteilt wird. Ist kein Bild vorhanden, erst alle 6000
    Datensätze. Und zwar hab ich mir das so gedacht:
    PHP-Code:
    if(stristr($werte[21],"http:")!=""){ //prüfen ob Bild-URL vorhanden
        // wenn Bild schon vorhanden, dann Bild-URL nicht eintragen
        
    $sql="SELECT id_image FROM "._DB_PREFIX_."image WHERE
                      (id_product='"
    .$tree."') LIMIT 1";
        
    $erg=mysql_num_rows(Db::getInstance()->Execute($sql));
        if(
    $erg==0)
        {
            
    $text.=$werte[21].";\n";   //Bild-URL und Feature        
                    
    $y++;
        }
        else            
        {        
                    
    $text.=";\n";   //Bild-URL und Feature
                    
    $z++;
        } 
    //else $erg==0
    //if stristr($werte[21])
    else
    {
       
    $text.=";\n";
       
    $z++;
    }

    // Prüfen ob y = 1201 bzw. z = 6001 ist, wenn ja dann nächste Datei
    if($y==1201){
        
    fclose($dst);
        
    $dst $this->openCsvFile("produkte".$nummer.".csv");
        
    $y=1;$z=1;$nummer++;    
    }

    if(
    $z==6001){
        
    fclose($dst);
        
    $dst $this->openCsvFile("produkte".$nummer.".csv");
        
    $z=1;$y=1;$nummer++;    

    Das klappt ja auch soweit. Jedenfalls wenn in allen DS ein Bild angegeben ist bzw. in allen keines.
    Jetzt kann es aber auch sein das in einigen ein Bild angegeben ist und in anderen nicht.
    Somit wird dann nicht mehr korrekt geteilt.
    Irgendwo hab ich da nen Denkfehler drin. Nur wo?

  • #2
    Moin moin

    Irgendwie verstehe ich nicht ganz deine Anforderung an die Teilung.
    Also sowie du einmal die Bedienung (Bild vorhanden) hast, dann soll,
    auch wenn es nur ein Bild ist in dem ganzen Datensatz,
    dieser Datensatz alle alle 1200 mal geteilt werden.
    Sonst alle 6000?

    Kommentar


    • #3
      Ja so in der Art.
      Vielleicht gibts ja auch ne ganz andere Variante.

      Kommentar


      • #4
        Vielleicht gibts ja auch ne ganz andere Variante.
        Ja vielleicht.








        Ach so. Du willst die von uns hören. Hast DU da nicht was vergessen? Hintergrundinformationen zum Beispiel?!!
        so in der Art.
        Auch mega-präzise. Mach Dir nur keine Umstände.
        [COLOR="#F5F5FF"]--[/COLOR]
        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
        [COLOR="#F5F5FF"]
        --[/COLOR]

        Kommentar


        • #5
          Viele Wege führen nach Rom.

          Wie Wäre es hier in deinem Code
          PHP-Code:
          if($erg==0)
              {
                  
          $text.=$werte[21].";\n";   //Bild-URL und Feature        
                          
          $y++;
                  
          $maxRow 1201;  // hier die maximale Spaltenanzahl bei Bild Featue zu reduzieren.
              

          und dann
          PHP-Code:
          if( $maxRow==1201){
              
          fclose($dst);
              
          $dst $this->openCsvFile("produkte".$nummer.".csv");
              
          $y=1;$z=1;$nummer++;    
          }

          if( 
          $maxRow==6001){
              
          fclose($dst);
              
          $dst $this->openCsvFile("produkte".$nummer.".csv");
              
          $z=1;$y=1;$nummer++;    

          jetzt musst du am Anfang der Schleife, die hier in deinem PHP-Code nicht zu sehen
          ist noch $maxRow auf 6000 setzen.

          Kommentar


          • #6
            alleine der Passus
            daß wenn Bilder vorhanden sind
            ist schon mißverständlich. Im File, in der aktuellen Suchmenge oder wo? Was ist so schwer daran, mal einen vernünftigen, verständlichen Beitrag zu schreiben?
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              In der CSV-Datei sind Produkte gespeichert.
              Ich überprüfe in einer Tabelle (darin ist die Produkt-ID und die Bild-ID gespeichert) anhand der Produkt-ID ob eine Bild-ID vorhanden ist.

              Wenn aber neue Produkte hinzu kommen, ist logischerweise für diese noch kein Bild vorhanden. Oder beim 1. Import gab es für das Produkt noch kein Bild, jetzt aber schon.

              Jetzt soll es aber so sein das die Datei nicht sofort nach 1200 Datensätzen aufgeteilt wird, nur weil ein Bild vorhanden ist.
              Es sollte so sein, das nach 1200 DS geteilt wird, wenn in jedem DS ein Bild ist, nach 6000 DS wenn in keinem DS ein Bild ist, und wen beides vorhanden ist nach 3000 DS geteilt wird.

              Ich hoffe ich konnte es einigermaßen erklären.

              Kommentar


              • #8
                Nicht wirklich. Was hat das Aufteilen mit den Bildern zu tun? Was ist wenn in 1199 DS „ein Bild ist“ (was auch immer das bedeuten mag)? Was heißt überhaupt „aufgeteilt“? Was soll da passieren, was ist mit dem Rest? Geht der Zähgler von vorne los?
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #9
                  Nein, die Aufteilung passiert dshalb, weil sonst ein Serverfehler entsteht.
                  Ich nehme an es liegt an der Scriptausführungszeit.

                  Die Bilder werden von einer Bild-Url auf dem Server gespeichert. Dann werden von diesem Bild 6 verschiedene Bilder angelegt (von klein bis groß) und in
                  einen Bildordner kopiert.

                  Das Problem ist, wenn in jedem DS eine Bild-Url angegeben ist funktionierts (Teiler 1200). Wenn in allen DS keine Bild-Url angegeben ist auch (Teiler 6000). Nur wenn mal eine Bild-Url angegeben ist und mal nicht kommt die Aufteilung halt durcheinander...

                  Kommentar


                  • #10
                    Ich steigt aus. Das ist mir alles zu unspezifisch.
                    [COLOR="#F5F5FF"]--[/COLOR]
                    [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                    [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                    [COLOR="#F5F5FF"]
                    --[/COLOR]

                    Kommentar


                    • #11
                      Was ist daran unspezifisch?

                      Ich habe eine CSV-Datei mit rund 13000 Produkten. Diese soll in eine
                      Tabelle importiert werden. Weil aber so viele Produkte vorhanden sind, muß ich die Datei aufsplitten, da sonst ein Serverfehler beim Import auftritt.

                      Ist in jedem Datensatz eine Bild-Url angegeben, kann ich rund 1200 DS einfügen ohne Fehler. Ist in keinem DS eine Url angegeben, liegt die Anzahl bei rund 6000.
                      Darum Bilder vorhanden, 1200 keine vorhanden 6000.
                      Das Problem liegt jetzt daran, das wenn in manchen DS eine Url angegeben ist und in manchen nicht, haut mein Quelltext nicht mehr hin.

                      Dann sind es halt nicht 1200 Ds bzw. 6000 Ds sonderen halt unterschiedlich viele. Je nachdem welche Variable zuerst den Grenzwert erreicht.

                      Kommentar


                      • #12
                        Ich sehe da oben
                        PHP-Code:
                        $this->openCsvFile("produkte".$nummer.".csv"); 
                        - Was hat openCsvFile("produkte".$nummer.".csv") mit 13000 Produkten in einer CSV zu tun? Offensichtlich öffnest DU für jede Nummer eine Datei
                        - worauf bezieht sich $this
                        PHP-Code:
                        if($y==1201){ 
                        bezieht sich ja offensichtlich auf eine Schleife. Nur - wo ist die
                        - Wenn ja: Du setzt in der Schleife Datenbankabfragen ab. Seriously? Kein Wunder, dass Dein Server da dicht macht.

                        - Wie der Split geht und wo da wieder angefangen wird… - no one knows

                        Dein Code mag etwas mit der Anwendung zu tun zu haben. Nur hilft er uns überhaupt nicht weiter.

                        DAS ist unspezifisch.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          Das
                          PHP-Code:
                          $dst $this->openCsvFile("produkte".$nummer.".csv"); 
                          ist für die Aufteilung zuständig (die Zieldatei). Die Teile heißen dann produkte1.csv, produkte2.csv usw.

                          Hier mal der komplette Quelltext der Funktion:
                          PHP-Code:
                              private function Produkte(){
                                  global 
                          $spanne;
                                  
                          $result "fertig";
                                  
                          $src $this->openCsvFile();
                                  
                          $dst $this->openCsvFile("produkte.csv");
                                
                          $zaehler=1//Produkt-ID
                                  
                          $y=1;$z=1;$nummer=1;
                                  
                          $path _PS_PROD_IMG_DIR_;

                                  while((
                          $werte=fgetcsv($src0";"))!==FALSE)
                                  { 
                          // Daten werden aus der Datei in ein Array $data gelesen
                                  
                          $tree="";
                                      if(
                          stristr($werte[0],"Hersteller_Artikelnummer")==false){
                          //id des Produktes bestimmen
                          $sql="SELECT id_product FROM "._DB_PREFIX_."product_lang WHERE
                                            (name='"
                          .utf8_encode(preg_replace(array("#[<>\#]#","#[=]#","#[']#"),array(" ","","''"),$werte[3]))."') LIMIT 1";  
                          //print $sql."- ID:";
                                //if($zaehler==75) exit;
                                  
                          $erg=Db::getInstance()->Execute($sql);
                                  if(
                          $erg and mysql_num_rows($erg)>0){
                                      
                          $tree=mysql_result($erg,0);
                          //            print $tree."<br />";
                                      //$tree= mysql_fetch_array($erg);
                                      
                          $text=$tree.";1;";
                                    
                          $zaehler++;
                                  }
                              else    
                          $text=";1;"//$zaehler.";1;";                 // ID und Aktiv
                                          
                          $text.=utf8_encode(preg_replace(array("#[<>\#]#","#[=]#","#[']#"),array(" ","","''"),$werte[3])).";";   // Name
                                          
                          $text.=utf8_encode($werte[6]).";";    // Kategorien
                                          
                          $preis=str_replace(",",".",$werte[12])+str_replace(",",".",$werte[12])/100*$spanne;
                                          
                          $text.=$preis.";";   // Preis ohne MWST oder mit
                                      
                          $text.="19%;";   // Steuersatz
                                      
                          $vpreis=$preis+($preis*0.19);
                                          
                          $text.=$vpreis.";";   // Verkaufspreis
                                          
                          $text.="0;";                          // Aktion
                                          
                          $text.=";;;;";                        // Rabatte
                                          
                          $text.=utf8_encode($werte[2]).";";    // Artikelnummer
                                          
                          $text.=utf8_encode($werte[0]).";";    // Artikelnummer bei Lieferant
                                          
                          $text.=";";                           // Lieferant
                                      
                          $text.=utf8_encode($werte[1]).";";    // Hersteller    
                                  
                          $text.=utf8_encode($werte[22]).";";   // EAN        
                                  
                          $text.=";";                                                      // Ökosteuer        
                                  
                          $text.=str_replace(",",".",$werte[20]).";";   // Gewicht        
                                  
                          $text.=$werte[9].";";   // Menge        
                                  
                          $text.=";";   // Kurzbeschreibung     
                                  
                          $text.=utf8_encode(str_replace(array(";",chr("149")),array(",","*"),$werte[18])).";";   // Beschreibung
                                  
                          $text.=";;;;;;";                      // Metatags, Schlagworte usw.
                          if(stristr($werte[21],"http:")!=""){ //prüfen ob Bild-URL vorhanden
                              // wenn Bild schon vorhanden, dann Bild-URL nicht eintragen
                              
                          $sql="SELECT id_image FROM "._DB_PREFIX_."image WHERE
                                            (id_product='"
                          .$tree."') LIMIT 1";
                              
                          $erg=mysql_num_rows(Db::getInstance()->Execute($sql));
                              if(
                          $erg==0)
                              {
                                  
                          $text.=$werte[21].";\n";   //Bild-URL und Feature        
                                          
                          $y++;
                              }
                              else            
                              {        
                                          
                          $text.=";\n";   //Bild-URL und Feature
                                          
                          $z++;
                               } 
                          //else $erg==0
                          //if stristr($werte[21])
                          else
                          {
                              
                          $text.=";\n";
                              
                          $z++;
                          //else if stristr($werte[21])

                          // Prüfen ob y = 1201 bzw. z = 6001 ist, wenn ja dann nächste Datei
                          if($y==1201){
                              
                          fclose($dst);
                              
                          $dst $this->openCsvFile("produkte".$nummer.".csv");
                              
                          $y=1;$z=1;$nummer++;    
                          }
                          if(
                          $z==6001){
                              
                          fclose($dst);
                              
                          $dst $this->openCsvFile("produkte".$nummer.".csv");
                              
                          $z=1;$y=1;$nummer++;    


                                          if(
                          fwrite($dst$text)==false)
                                              
                          $result=false// komplette Zeile ins Ziel schreiben
                                      
                          $zaehler++;
                                      } 
                          //if $werte[0]!=Hersteller_Artikelnummer
                                  
                          // while-Schleife
                                      
                                  
                          fclose($src);
                                  
                          fclose($dst);
                                return 
                          $result;
                              } 
                          //function Produkte() 
                          Hier noch die Funktionen zum Öffnen und schliessen der Dateien:
                          PHP-Code:
                              private function openCsvFile($file="")
                              {
                                  
                          $handle fopen(dirname(__FILE__).'/../import/preisliste.csv''r');
                                  if(
                          $file!=""$handle fopen(dirname(__FILE__).'/../import/'.$file'a+');
                                  if (!
                          $handle)
                                      die(
                          Tools::displayError('Cannot read the csv file'));
                                  return 
                          $handle;
                              } 
                          //function openCsvFile()

                          /*-------------Funktion zum Schliessen der geöffneten CSV Datei---------------*/    
                              
                          private function closeCsvFile($handle)
                              {
                                  
                          fclose($handle);
                              } 
                          //function closeCsvFile() 
                          So, ich hoffe damit sind alle Unklarheiten beseitigt

                          Kommentar


                          • #14
                            Ich mag mich gerade nicht durch dieses Dickicht durchwühlen. Nur so viel:

                            - DB-Aufrufe in einer Schleife sind der Tod für jede Performance. Viel besser wäre es, alle vorhandenen (je nachdem wie viele das sind) Bildpfade (einmalig !) in ein Array auszulesen und damit zu vergleichen.
                            - Die Zähllogik ist doch ganz einfach. Du machst einen Zähler für Datensätze, einen für Pfade. Am Anfang und nach jedem Schnitt setzt DU auf Null. Dann:
                            - Setze Maximum auf 6000
                            - Durchläufst Du die Datensätze,
                            - für jeden Inkrement des DS-Counters
                            - für jeden Bildpfad Inkrement des Pfad-Counters
                            - Wenn Bildpfad gefunden setze Maximum auf 3000
                            - Wenn DS-Counter == 1200 und DS-Counter == Pfad-Counter: Schnitt.
                            - Wenn DS-Counter == Maximum: Schnitt.
                            [COLOR="#F5F5FF"]--[/COLOR]
                            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                            [COLOR="#F5F5FF"]
                            --[/COLOR]

                            Kommentar


                            • #15
                              Mal sehn ob ich das richtig verstanden habe.
                              Ich lege ein Array an in dem ich alle Produktnamen und dazugehörige ID speichere.
                              PHP-Code:
                              $tree="";
                              $sql="SELECT id, name FROM produkte ORDER BY id";
                              $result=mysql_query($sql); 
                              Und dann in der Scheife:
                              PHP-Code:
                              while ($row mysql_fetch_array($resultMYSQL_NUM)) {
                                  if(
                              $werte[3]==$row[1])
                                  {
                                     
                              $tree=$row[0];  
                                     break;
                                  } 
                              }
                              $text=$tree.";";
                              ... 
                              Jetzt zu den Teilern:
                              PHP-Code:
                              $maxDS=6000;

                              if(
                              stristr($werte[21],"http:")!=""){ //prüfen ob Bild-URL vorhanden
                                  // wenn Bild schon vorhanden, dann Bild-URL nicht eintragen
                                  
                              $sql="SELECT id_image FROM "._DB_PREFIX_."image WHERE
                                                (id_product='"
                              .$tree."') LIMIT 1";
                                  
                              $erg=mysql_num_rows(Db::getInstance()->Execute($sql));
                                  if(
                              $erg==0)
                                  {
                                      
                              $text.=$werte[21].";\n";   //Bild-URL und Feature        
                                      
                              $y++;
                                      
                              $maxDS=3000;
                                  }
                                  else            
                                  {        
                                              
                              $text.=";\n";   //Bild-URL und Feature
                                              
                              $z++;
                                              
                                   } 
                              //else $erg==0
                              //if stristr($werte[21])
                              else
                              {
                                  
                              $text.=";\n";
                                  
                              $z++;
                              //else if stristr($werte[21])

                              // Prüfen ob y = 1201 bzw. z = 6001 ist, wenn ja dann nächste Datei
                              if($y==1201){
                                  
                              fclose($dst);
                                  
                              $dst $this->openCsvFile("produkte".$nummer.".csv");
                                  
                              $y=1;$z=1;$nummer++;    
                              }
                              if(
                              $z==$maxDS){
                                  
                              fclose($dst);
                                  
                              $dst $this->openCsvFile("produkte".$nummer.".csv");
                                  
                              $z=1;$y=1;$nummer++;    

                              Kommentar

                              Lädt...
                              X