php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2009

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 25.02.2009, 16:48  
Neuer Benutzer
 
Registriert seit: 25.02.2009
Beiträge: 12
BlackBroom befindet sich auf einem aufstrebenden Ast
Standard Größer Textdatei einlesen

Hallo,
ich ein Script geschrieben, bei der eine größer Textdatei (txt) eingelesen wird und die Daten in eine MySQL Datenbank abgespeichert wird.
Die Textdatei ist wie folgt aufgebaut:
Matnr;Country_Code;...;ManufPartNo;Manufacturer
1;DE;...;HE123;Asus
etc.

Ich lese aus dieser Textdatei aber nur bestimmte Spalten aus z.B. Matnr, ManufPartNo und Manufacturer. Dies funktioniert auch alles soweit, aber das einlesen dauert sehr lange. Gibt es da vielleicht eine andere Methode, die schneller abläuft?

Hier ist mal mein PHP Code den ich nutze:
PHP-Code:
...
if(
file_exists($filename)) { 
    
$fp=fopen($filename,"r");
        while(
$line=fgets($fp)) {
            
$linewerte explode(";"$line);
            
            
$sql="SELECT *
            FROM produkte   
            WHERE lieferantnummer LIKE '"
.$linewerte[0]."' AND lieferid LIKE '".$lieferid."' LIMIT 1";
                                                        
            
$result mysql_query($sql) or die(mysql_error()); 
                                                
            
$rowanzahl mysql_num_rows($result);
                                            
            if (
$rowanzahl==0){
                
$meineartikelnummer generate_artikelnummer();
                
$aktliefernummer $linewerte[0];
                
mysql_query("INSERT INTO produkte (artikelnummer,lieferid,lieferantnummer,createdatum,changedatum) VALUES ('$meineartikelnummer','$lieferid','$aktliefernummer','$datum','$datum')") or die(mysql_error());
            }
                
$produktnummer $linewerte[0];
                    
                
$ean $linewerte[9];
                
$null "";
                
$laenge strlen ($ean);
                if(
$laenge<13 && $ean!=""){
                    
$rest 13 $laenge;
                    for (
$i=1;$i<=$rest;$i++){
                        
$null $null."0";
                    }
                }
                
$ean $null.$linewerte[9];
                
$preis ereg_replace(',',".",$linewerte[12]);
                
$menge $linewerte[13];
                
$herstelername $linewerte[5];
                
$herstellernummer $linewerte[4];
                
$currency $linewerte[14];
                    
                if(
$linewerte[15]=="1" or $linewerte[15]=="3"){
                    
$steuer "19";
                }elseif(
$linewerte[15]=="2"){
                    
$steuer "7";
                }else{
                    
$steuer "19";
                }
                        

                
$kategorie htmlentities($linewerte[16]);
                
$gewicht ereg_replace(',',".",$linewerte[17]);
                
$typ $linewerte[18];
                                
                    
                    
mysql_query("UPDATE produkte SET ean = '$ean',preis = '$preis',menge = '$menge',herstellernummer = '$herstellernummer',currency = '$currency',steuerrate = '$steuer',kategorie = '$kategorie',gewicht = '$gewicht',produkttyp = '$typ',herstellername = '$herstellername',changedatum = '$datum' WHERE lieferantnummer LIKE '".$produktnummer."' AND lieferid LIKE '".$lieferid."' LIMIT 1") or die(mysql_error());
                
            }        
            
            
        } 
    
fclose($fp);    
}
... 
Es wird überprüft, ob das Produkt schon exisitiert oder nicht. Ist es vorhanden werden die Daten nur noch per Upate geändert, sonst wird das Produkt zuerst noch erstellt.

Hat da jemand vielleicht eine Idee?
Gruß,
Frank
BlackBroom ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 25.02.2009, 16:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ja
Code:
LOAD DATA INFILE
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 25.02.2009, 16:58  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

  • fgetcsv ist vielleicht etwas schneller.
  • Zitat:
    lieferantnummer LIKE '".$linewerte[0]."' AND lieferid LIKE '".$lieferid."'
    Warum an dieser Stelle LIKE statt = ?
    Wenn Du einen unique-Index für (lieferantnummer, lieferid) anlegst, wird kein zweiter Datensatz mit den selben Daten in beiden Feldern eingetragen. Das kannst Du zum Beispiel mit mysql_affected_rows abtesten.
David ist offline  
Alt 26.02.2009, 15:16  
Neuer Benutzer
 
Registriert seit: 25.02.2009
Beiträge: 12
BlackBroom befindet sich auf einem aufstrebenden Ast
Standard Frage zu LOAD DATA INFILE

Hallo,
Vielen Dank. Mit LOAD DATA INFILE geht das Einlesen ja sehr schnell.
mein Script sieht aktuell so aus:

PHP-Code:
mysql_query("LOAD DATA LOCAL INFILE '".$filename."' REPLACE INTO TABLE produkte FIELDS terminated by ';' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (@Matnr,@ManufPartNo,@Manufacturer
...) SET lieferantennummer=@Matnr,herstellnummer=@ManufPartNo,lieferid='2'..."
) or die(mysql_error()); 
Habe dazu aber noch ein paar Probleme:
1. Wenn ich diesen Code ein zweites Mal aufrufe, werde die Daten in der Datenbank nicht überschrieben, sondern neu eingefügt, so dass ich die Datensätze doppelt habe. Wie kann ich es machen, dass die vorhanden Datensätze überschrieben werden? Ich hatte gedacht, dies ginge mit REPLACE ändert aber nicht an der Sache.

2. Ich habe auch ein Feld Kategorie, in der Datenbank. Diese Kategorien stehen aber in der Textdatei mit Umlauten etc. drinnen. Diese Umlaute werden aber jetzt nicht mit übernommen. Das Wort wird vor einem Umlaut abgeschnitten z.B. Zubeh. Vorher hatte ich das mit htmlentities(...) gelöst.
Gibt es da irgendeine Möglichkeit, wie ich das hier auch ändern kann?

Gruß,
Frank
BlackBroom ist offline  
Alt 26.02.2009, 15:25  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

zu 1/ Indem Du einen Schlüssel definierst, dessen Wert nur einmal pro Tabelle vorkommen darf
zu 2/ Das hängt vermütlich mit den Zeichensatz/der DB Collation zusammen. Benutze konsequent UTF-8, dann sollte es klappen. Mehr dazu liefert die Google oder die Boardsuche.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 26.02.2009, 15:53  
Neuer Benutzer
 
Registriert seit: 25.02.2009
Beiträge: 12
BlackBroom befindet sich auf einem aufstrebenden Ast
Standard Antwort

Hallo,
vielen Dank nikosch.
Punkt 1 hat direkt funktioniert.

Bei Punkt 2 besteht noch das selbe Problem.
Die Kollation ist schon in UTF-8. Das habe ich beim anlegen der Datenbank gemacht. Auch habe ich, wenn ich die Verbindung zur Datenbank erstelle, folgenden Befehl dabei:
PHP-Code:
mysql_query("SET NAMES utf8"); 
Trotzdem werden die Umlaute nicht übernommen.

Gruß,
Frank
BlackBroom ist offline  
Alt 26.02.2009, 16:49  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Vermutlich ist das Script nicht UTF-8 oder die Eingabedatei.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline  
Alt 26.02.2009, 16:52  
Erfahrener Benutzer
 
Benutzerbild von Screeze
 
Registriert seit: 04.01.2009
Beiträge: 844
PHP-Kenntnisse:
Fortgeschritten
Screeze wird schon bald berühmt werden
Standard

oder das gleiche problem dass ich habe....
http://www.php.de/datenbanken/52251-utf8-kodierung.html
Screeze ist offline  
Alt 26.02.2009, 22:15  
Neuer Benutzer
 
Registriert seit: 25.02.2009
Beiträge: 12
BlackBroom befindet sich auf einem aufstrebenden Ast
Standard Antwort

Hallo,
als die Textdatei, die ich importiere, als UTF-8 Format speichere, werden die Umlaute richtig angezeigt.
Gibt es da irgendeine Möglichkeit, wie ich bei einer Textdatei die Codierung ändern kann, mit PHP?

Kann man eigentlich auch zwei Werte verbinden und diese dann in die MYSQL Datenbank speichern? z.B. Wert von @Matnr+'_'+$lieferid
Irgendwie sowas, sodass ich nacher folgenden Wert in der Datenbank habe 145879_2

Weil das Problem ist, wenn ich die Lieferantennummer als Schlüssel definiere und ein zweiter Lieferant hat die selbe Nummer, dann wird diese nicht eingefügt. Mache ich den Schlüssel weg, funktioniert die REPLACE Methode nicht. Mit der oben genannten Methode, hätte ich einen einmaligen Wert.

Gruß,
Frank
BlackBroom ist offline  
Alt 27.02.2009, 11:54  
Neuer Benutzer
 
Registriert seit: 25.02.2009
Beiträge: 12
BlackBroom befindet sich auf einem aufstrebenden Ast
Standard Antwort

Hallo,
die Umwandlung in UTF-8 habe ich jetzt selbst hinbekommen, mit:
PHP-Code:
file_put_contents($FileConvertediconv("ISO-8859-1","UTF-8",file_get_contents($FileToconvert))); 
So werden auch Umlaute in die Datenbank geschrieben.

Gruß,
Frank
BlackBroom ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Textarea: Einlesen - Problem.. Softyx PHP Tipps 2008 2 05.07.2008 12:49
Textdatei in Array Schreiben hoamer PHP Tipps 2008 18 03.03.2008 19:52
Textdatei in php einlesen matthros PHP Tipps 2006 13 13.03.2006 12:38
Variable als Textdatei Lokal speichern HSFighter PHP Tipps 2006 3 28.02.2006 12:13
[Erledigt] mit php umlaute un Textdatei schreiben (Apple Tiger PHP4) PHP Tipps 2007 7 29.12.2005 19:08
Problem beim einlesen von einer Textdatei bendigo PHP Tipps 2005-2 10 28.06.2005 11:45
Jede Zeile einer Textdatei einlesen Mex PHP Tipps 2005 3 02.03.2005 18:33
Textdatei durchsuchen CSS PHP Tipps 2005 3 26.02.2005 15:31
Textdatei einlesen --> schwieriger Fall??? PHP Tipps 2005 4 18.02.2005 15:36
Newsscript Ã* la Textdatei PHP Tipps 2004 10 10.09.2004 22:56
Eintrag aus Textdatei löschen? PHP Tipps 2004 1 04.09.2004 18:21
Textdatei auslesen und Dateien downloaden PHP Tipps 2004 1 15.08.2004 13:05
Mit PHP den Inhalt einer Textdatei in eine Tabelle einfüllen Stümper PHP Tipps 2004 3 09.08.2004 13:18
Textdatei in Array einlesen PHP Tipps 2004 8 07.08.2004 16:42
[Erledigt] Datei einlesen -&gt; in Variable schreiben PHP Tipps 2004 2 22.07.2004 11:33

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
load data local infile umlaute abgeschnitten, php file_put_contents file wird abgeschnitten, mysql umlaute werden beim einlesen abgeschnitten, php textdatei einlesen, php datum aus textdatei auslesen, php textdatei auslesen nach datum und wert, load infile abgeschnitten umlaut mysql, textdatei mit php einlesen, load local data infile umlaute, load data local infile umlaute werden abgeschnitten, php infile umlaute abgeschnitten, php datum aus text nur wen nach heute, load data infile umlaute werden abgeschnitten

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:21 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum