CSV oder TXT in MySQL über PHP

Black Crow

Mitglied
Hi

habe ein Script hier, dass CSV-Dateien einliest, verarbeitet und in die Datenbank einträgt. Soweit funktioniert es ja schon, Probleme tauchen allerdings jetzt nur auf, wenn HTML-Formatierungen wie <p> / </p> sich in der Datei befinden. Dann legt er einfach einen neuen Datensatz in der Datenbanktabelle an und geht die Zeile bis zum Ende. Das Ende schreibt er dann einfach halt in den neuen Datensatz.

Das soll er natürlich jetzt nicht tun. Ich habe schon versucht, ihm die HTML-Formatierungen über strip_tags zu killen, interessiert ihn nicht und eigentlich sollen ja die Absätze in den Texten bleiben. Natürlich könnte man jetzt die CSV-Datei überarbeiten und die ganzen <p> / </p> in Absätze teilen, aber genau das ist bei 5.000 Zeilen ne beschissene (sorry den Begriff) Arbeit.

PHP:
 $file_csv = $dir ."/". $productfile;
                    chmod ($file_csv, 0777);
                
                    $row = 1;                                      // Anzahl der Arrays
                    $handle = fopen ($file_csv,"r");              // Datei zum Lesen öffnen
                    while ( ($data = fgetcsv ($handle, 1000, "\t")) !== FALSE ) { // Daten werden aus der Datei
                                                                   // in ein Array $data gelesen
                        $num = count ($data);                      // Felder im Array $data
                                                                   // werden gezählt
                        
                        $ptitle = $data[0];
                        $pprice = $data[1];
                        $pdistribution = $data[2];
                        $plshop = $data[3];
                        $plproduct = $data[4];
                        $longdef = $data[5];
                        $shopname = $data[6];
                        $bigpic = $data[7];
                        $pdate = $data[8];
                        
                        $longdef = ereg_replace("ä","&auml;",$longdef);
                        $longdef = ereg_replace("ö","&ouml;",$longdef);
                        $longdef = ereg_replace("ü","&uuml;",$longdef);
                        $longdef = ereg_replace("Ä","&Auml;",$longdef);
                        $longdef = ereg_replace("Ö","&Ouml;",$longdef);
                        $longdef = ereg_replace("Ü","&Uuml;",$longdef);
                        $longdef = ereg_replace("ß","&szlig;",$longdef);
                        $longdef = ereg_replace("€","&euro;",$longdef);
                        
                        $pdistribution = ereg_replace("ä","&auml;",$pdistribution);
                        $pdistribution = ereg_replace("ö","&ouml;",$pdistribution);
                        $pdistribution = ereg_replace("ü","&uuml;",$pdistribution);
                        $pdistribution = ereg_replace("Ä","&Auml;",$pdistribution);
                        $pdistribution = ereg_replace("Ö","&Ouml;",$pdistribution);
                        $pdistribution = ereg_replace("Ü","&Uuml;",$pdistribution);
                        $pdistribution = ereg_replace("ß","&szlig;",$pdistribution);
                        $pdistribution = ereg_replace("€","&euro;",$pdistribution);
                        
                        $ptitle = ereg_replace("ä","&auml;",$ptitle);
                        $ptitle = ereg_replace("ö","&ouml;",$ptitle);
                        $ptitle = ereg_replace("ü","&uuml;",$ptitle);
                        $ptitle = ereg_replace("Ä","&Auml;",$ptitle);
                        $ptitle = ereg_replace("Ö","&Ouml;",$ptitle);
                        $ptitle = ereg_replace("Ü","&Uuml;",$ptitle);
                        $ptitle = ereg_replace("ß","&szlig;",$ptitle);
                        $ptitle = ereg_replace("€","&euro;",$ptitle);
                        
                        $result = mysql_query("INSERT INTO wp_products (ptitle, pprice, pdistribution, plshop, plproduct, longdef, shopname, bigpic, pdate) VALUES ('$ptitle','$pprice','$pdistribution','$plshop','$plproduct','$longdef','$shopname','$bigpic','$pdate')");
                        
                        
                    }
                    fclose ($handle);

Für eure Hilfe wäre ich euch sehr verbunden.

LG
Black Crow
 
Du hast als Feldtrennzeichen den Tabulator ("\t") angegeben! Sicher das in der Datei selber nicht an manchen Stellen noch irgendwo ein solcher Tabulator steckt wo er nicht hingehört und nicht die HTML Zeichen das Problem sind !!
 
Oh, das war der falsche Teil, das war der Teil, wo die TXT-Datei verarbeitet wird :D Aber da ist das Problem das selbe.

PHP:
	$file_csv = $dir ."/". $productfile;
					chmod ($file_csv, 0777);
				
					$row = 1;                                      // Anzahl der Arrays
					$handle = fopen ($file_csv,"r");              // Datei zum Lesen öffnen
					while ( ($data = fgetcsv ($handle, 1000, ";")) !== FALSE ) { // Daten werden aus der Datei
					                                               // in ein Array $data gelesen
					    $num = count ($data);                      // Felder im Array $data
					                                               // werden gezählt
					    
					    $ptitle = $data[0];
					    $pprice = $data[1];
					    $pdistribution = $data[2];
					    $plshop = $data[3];
					    $plproduct = $data[4];
					    $longdef = $data[5];
					    $shopname = $data[6];
					    $bigpic = $data[7];
					    $pdate = $data[8];
							    
						$longdef = ereg_replace("ä","&auml;",$longdef);
						$longdef = ereg_replace("ö","&ouml;",$longdef);
						$longdef = ereg_replace("ü","&uuml;",$longdef);
						$longdef = ereg_replace("Ä","&Auml;",$longdef);
						$longdef = ereg_replace("Ö","&Ouml;",$longdef);
						$longdef = ereg_replace("Ü","&Uuml;",$longdef);
						$longdef = ereg_replace("ß","&szlig;",$longdef);
						$longdef = ereg_replace("€","&euro;",$longdef);
						
						$pdistribution = ereg_replace("ä","&auml;",$pdistribution);
						$pdistribution = ereg_replace("ö","&ouml;",$pdistribution);
						$pdistribution = ereg_replace("ü","&uuml;",$pdistribution);
						$pdistribution = ereg_replace("Ä","&Auml;",$pdistribution);
						$pdistribution = ereg_replace("Ö","&Ouml;",$pdistribution);
						$pdistribution = ereg_replace("Ü","&Uuml;",$pdistribution);
						$pdistribution = ereg_replace("ß","&szlig;",$pdistribution);
						$pdistribution = ereg_replace("€","&euro;",$pdistribution);
						
						$ptitle = ereg_replace("ä","&auml;",$ptitle);
						$ptitle = ereg_replace("ö","&ouml;",$ptitle);
						$ptitle = ereg_replace("ü","&uuml;",$ptitle);
						$ptitle = ereg_replace("Ä","&Auml;",$ptitle);
						$ptitle = ereg_replace("Ö","&Ouml;",$ptitle);
						$ptitle = ereg_replace("Ü","&Uuml;",$ptitle);
						$ptitle = ereg_replace("ß","&szlig;",$ptitle);
						$ptitle = ereg_replace("€","&euro;",$ptitle);
					    
					    $result = mysql_query("INSERT INTO wp_products (ptitle, pprice, pdistribution, plshop, plproduct, longdef, shopname, bigpic, pdate) VALUES ('$ptitle','$pprice','$pdistribution','$plshop','$plproduct','$longdef','$shopname','$bigpic','$pdate')");
					    
					    
					}
					fclose ($handle);

Das ist der Teil, wo die CSV verarbeitet wird.

LG
Black Crow
 
Ok, dann formuliere ich die Frage auch ein bisschen anders. Kann es bei den Textdateien sein das da irgendwo ein "," drinsteht wo es nicht hingehört?

Die Chance darauf ist meiner Meinung nach recht groß wenn es sich um HTML Daten handelt jedes richtig konvertierte Ä, Ö, Ü usw. hätte am Ende ein ";" stehen und würde dir Probleme machen.


Ich lese aus unserem Warenwirtschaftssystem auch öfters Daten aus und war früher auch immer an verzweiflen wenn die Daten nicht korrekt in der DB ankamen. Grund war hier immer ein Feldtrennzeichen wo es nicht hingehörte. Ich verwende seitdem das "~" als Feldtrennzeichen und das "@" als Satztrennzeichen da ist sichergestellt das es bei diesen Daten garantiert nie vorkommt.
 
Hi

ich guck gerade, was mir halt aufgefallen ist, dass in der Datenbank alles ab da geteilt wird, wo wie bereits gesagt ein </p> oder <p> steht.

Das mit der ~, wie krieg ich dieses Feldtrennzeichen in Excel her? Hab noch nicht so viel mit CSV gearbeitet. Die Dateien werden in Excel aufbereitet, und dann in CSV gespeichert.

LG
Black Crow
 
Das Ändern des Feldtrennzeichens ist (soweit ich weiß) in Excel von Haus aus nicht möglich, ABER:

Systemsteuerung -> Regions- und Sprachoptionen -> Regionale Einstellungen -> Ändern

Dort gibt es auf dem Register "Zahlen" das Feld "Listentrennzeichen" und da ist als Standardwert das ";" eingetragen, kann aber in jedes beliebige Zeichen geändert werden.

Hoffe mal das dir das dann auch hilft.

Gruß Thomas

Wenn bereits eine CSV-Datei mit dem ";" als Trennzeichen existiert, dann muss diese zuerst mit Excel geöffnet werden und dann die Änderung wie oben beschrieben durchgeführt werden. Wird die Datei dann gespeichert, wird das alte (";") automatisch durch das neue Trennzeichen (z.B. "~") ersetzt. Wird die Änderung vor dem Öffnen durchgeführt, kann Excel die CSV-Datei nicht mehr korrekt öffnen
 
Zuletzt bearbeitet:
Hi

danke dir für deine Hilfe. Hab jetzt rausgefunden, woran es lag. Ich habe blöderweise die Länge verkehrt angegeben, nämlich auf 1000 Zeichen begrenzt. Das war der Fehler ;) Jetzt funktioniert alles ;)

LG
Black Crow
 
Hi,

gibt es denn kein Tool welches einem das Codieren von PHP Seiten erspart? Meine Imports müssen
immer wieder angepasst werden da der Kunde sehr "flexibel" ist. Wenn ich dann jedesmal 1-2 Tage
für ein "bischen" codieren abrechne rennt der mir irgendwann mal davon :-/

Zitat: "...kann man dies nicht selber machen oder allgemein handhaben..."

Gruß

Markus
 
Hi
du suchst so was wie ein EDI (Enterprise Data Integration) oder
ETL (Extract Transform Load) tool. Google "ETL EDI php excel" oder schau
mal unten auf die genannten Tools.

Cocoon von Apache (Java)
XML Pipeline (XML mapping file) mit diversen Adapter für das Lesen und
Schreiben von Daten. Excel und Datenbank habe ich Netz auch schon
mal gefunden. Ist allerdings Java und ist nicht für den Endkunden geeignet.

MapForce von Altova (Windows Program)
Mächtiges Werkzeug im Mappings (IMports) von diversen Quellen
zu diversen Senken herzustellen. Kann auch Code generieren.
Für kompetente Endkunden eventuell geeignet.

dbTube.org (PHP)
PHP Ajax application für das importieren von Daten. Fokus der
Anwendung ist mySQL, PHP und Excel. Einfach zu handhaben.
Kann mir vorstellen, dass man dies auch einen geschulten Kunden
in die Hand geben könnte.

CloverETL (Java)
Sehr mächtiges Framework für jede art von Datenintegration.
Man benötigt allerdings ein bischen Einarbeitung und ist nicht
gerade klein....dafür mächtig.

Oder schau doch mal unter
http://www.manageability.org/blog/stuff/open-source-etl

good luck

Marquee
 
Hi,

ja wie - nur eine PHP Lösung? Dummerweise ist die auch kommerziell.
Naja - ich denke, dass ich mal die 4.99 investieren werden. Viel falsch
machen kann man bei dem Betrag ja nicht.

Trotzdem NOCHMAL der Aufrufe:
Gibt es eine generische (graphische) Lösung für Excel Imports in PHP?

Ich bin ein wenig überrascht muss ich sagen. PHP ist so weit verbreitet
und dieses Problem ist so verbreitet.

Gruß
 

Neue Beiträge

Zurück