CSV-Import Texttrenner entfernen

julia29

Erfahrenes Mitglied
Hallo,
habe mir ein Script zusammengestellt wo eine lokal bereits auf dem Server liegende CSV-Datei mit festem Namen in eine MySQL eingelesen werden soll. Klappt eigentlich auch alles sehr gut bis auf die Tatsache das ich die Texttrenner ( " " ) nicht aus meinem $my_array herausbekomme. Verschiede Versuche scheiterten bisher. Somit werden die Feldinhalte einschl. der Texttrenner abgespeichert ("Inhalt Feld 1", "Inhalt Feld 2", "Inhalt Feld 3", usw.)

Wie kann ich es anstellen, dass ich aus dem Array die Texttrenner herausbekomme und die Daten trotzdem in der MySQL abgespeichert werden.

PHP:
<?php	
#error_reporting(E_ALL);

if ($p1 != true) {
$Link=mysql_connect("localhost","web123","user123") or die (mysql_error());
mysql_select_db("db123");
$table = "tabelle1";
}

#$temppath= "/daten/data.csv";	// wurde nicht gefunden
$temppath= "http://www.domain.de/daten/data.csv";

//Tempdatei öffnen
$fp = @fopen($temppath, "r") or die ("Kann Datei nicht lesen.");

//Zeilen auslesen und in der Datenbank speichern
#$opt1 = "FIELDS TERMINATED BY ';'";
#$opt2 = "OPTIONALLY ENCLOSED BY '\"'";
while ($line = fgets($fp)) {
$my_array = explode(';',$line,6);
#$my_array = explode($opt1,$line,223);

# Text in die MySQL schreiben
include ("check_login.php");
$sql = "INSERT INTO $table SET    feld6='$my_array[6]',
											feld5='$my_array[5]',
                                            feld4='$my_array[4]',
                                            feld3='$my_array[3]',
                                            feld2='$my_array[2]',
                                            feld1='$my_array[1]',
                                            feld0='$my_array[0]';";

if( mysql_query($sql)){
$pruef = TRUE;
}	
}
fclose($fp);
?>

Wie müsste ich meinen Code ergänzen?
mfg
Julia
 
das hatte ich auch schon versucht, jedoch ohne Erfolg.

Ich habe mein Array über str_replace in Variable geschrieben und diese Variablen im nächsten Schritt den entsprechenden Feldern zugeordnet.

PHP:
$feld5 = str_replace('"', '\"', $my_array[5]); 
$feld4 = str_replace('"', '\"', $my_array[4]); 
$feld3 = str_replace('"', '', $my_array[3]);              //falsche Schreibweise, so geht es
$feld2 = str_replace('"', '', $my_array[2]); 
$feld1 = str_replace('"', '', $my_array[1]); 
$feld0 = str_replace('"', '', $my_array[0]);

//Variable in die SQL-Felder schreiben
....
feld5='$feld5',
feld4='$feld4',
feld3='$feld3',
feld2='$feld2',
feld1='$feld1',
feld0='$feld0';";

In der Schreibweise Feld0 bis Feld3 klappt es. Ich habe aber zwei Felder dort befindet sich HTML-Code, dort sollen die Anführungsstriche im Code selber nicht entfernt werden.
Wie kann ich dies erreichen?
 
Zuletzt bearbeitet:
Warum so umstendlich wenn man das auf einmal machen kann?

PHP:
$my_array = str_replace('"', '', $line); 
$my_array = explode(';',$my_array,6);

Ich habe aber zwei Felder dort befindet sich HTML-Code, dort sollen die Anführungsstriche im Code selber nicht entfernt werden.

Da liegt aber dann in der Planung schon ein Hund drin Hmtl befehle würd ich nicht in der Db ablegen.
Sowas kannst du dann nur mehr über Reguläre ausdrücke rausfiltern.
preg_match,preg_replace unsw.

Mfg Splasch
 
Zuletzt bearbeitet:
ooooohhhh, super kurz, besonders interessant wenn es sich um viele Felder handelt.
Vielen Dank für den Tipp.

Bei HTML-Inhalte zerhaut er mir dann den Code. Es lässt sich leider nicht anders machen als das ich den html-Code mit in einem Feld ablege.
Mit str-replace gehen natürlich diese Einstellungen verloren:

HTML:
<head>
<meta http-equiv="Content-Language" content="de">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

Meine Idee die zwei Felder mit HTML-Code nicht mit str_replace bearbeiten. Es sind ja korrekt immer nur das 1 und das letzte Zeichen im Feld, das sollte doch sicherlich noch anders herauszufiltern sein, auch wenn es z.B. in der SQL bereits abgelegt ist.

Hättest Du da auch noch eine Idee?
 
hallo,

so auf die Schnelle habe ich den Vorteil (noch) nicht erkannt, zumal es nun bis auf die beiden HTML-Felder gut klappt.
Könnte ich denn damit mein Problem mit den beiden Feldern die HTML-Code beinhalten lösen?
 
Hi,

hallo,
so auf die Schnelle habe ich den Vorteil (noch) nicht erkannt

Das ist doch ganz einfach. Die Funktion nimmt Dir das Zerlegen der Zeile und Entfernen der Field-Enclosures komplett ab und liefert Dir ein Array mit den Feldinhalten zurück.

Könnte ich denn damit mein Problem mit den beiden Feldern die HTML-Code beinhalten lösen?

Warum probierst Du es nicht einfach mal aus?
Wenn die Daten richtig in der Datei stehen, ja. D.h. wenn das Anführungszeichen als Feldbegrenzer eingesetzt wird, müssen Anführungszeichen innerhalb der Feldinhalte natürlich mit einem Backslash maskiert sein.

LG
 
hi,

vielen Dank. Mit dem fgetcsv() funktioniert es super, auch die Anführungsstriche innerhalb meines HTML-Code bleiben alle erhalten.

Leider gibt es auch noch einen Haken. Beim Feld wo der HTML-Code steckt wird bei Antreffen eines Leerzeichens ein neuer Datensatz angelegt und beim nächsten Leerzeichen wieder ein neuer Datensatz. Läßt sich dies auch noch ändern, damit der komplette Code in einem Feld gehalten werden kann?

Gruß
Julia
 
Hi
Julia29

Das Problem an der Sache ist das deine Csv Datei nicht richtig aufgebaut ist!
Eine Csv Datei muß ein eindeutiges Trennzeichen besitzen das nieregendswo anders in der Csv Datei vorkommt.

Ob das Trennzeichen nun komma oder was anderes ist kann man selbst bestimmen.Meistens werden eben solche Zeichen verwendet die man selten braucht wie zb ; # (strichpunkt,Raute)

Wenn du als Trennzeichen Leerzeichen eingeben hast dann ist auch klar das bei jeden Leerzeichen ein neuer Datensatz gebildet wird.

Siehe unter:
http://at.php.net/manual/de/function.fgetcsv.php

array fgetcsv ( resource $handle , int $length [, string $delimiter [, string $enclosure ]] )

Mit $delimiter kannst du selbt das Trennzeichen bestimmen wo der nächste Datensatz beginnt.

Mfg Splasch
 
Zurück