PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks. |
 |

10-09-2010, 21:14
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
CSV Daten auslesen (PHP) und dann in MySQL speichern
Hallo,
ich versuche schon die ganze Zeit eine CSV Datei in meine MySQL DB einzubetten. Dies möchte ich mit php verwirklichen. Mit " LOAD DATA (LOCAL) INFILE" kann ich immer nur die gesamte CSV Datei importieren, dabei möchte ich bis zu einem bestimmten Codewort den Import ausführen.
Jetzt versuche ich es mit fgetcsv, habe aber Probleme die Daten mit den INSERT INTO Befehlen genau zuzuordnen. Denn immerhin ändert sich ja immer das Datum und der VALUE:
PHP-Code:
/* Inhalt der statistik.csv
01.08.2001#62.159.232.250#www.selfphp3.de
02.08.2001#212.82.34.222#www.selfphp4.de
02.08.2001#http://suchen.abacho.de#62.159.232.250
03.08.2001#http://www.fireball.de#212.185.44.15
*/
$row = 1; // Anzahl der Arrays
$handle = fopen ("statistik.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
$row++; // Anzahl der Arrays wird
for ($c=0; $c < $num; $c++) { // FOR-Schleife, um Felder
print $data[$c] . "<br>\n"; // des Arrays auszugeben
$sql="INSERT INTO tbl_basis (datum) VALUES ('$data[$c]')";
}
}
fclose ($handle);
Ich denke, ich mache einen groben Fehler bei der Aufsplittung der csv daten.
P.S. ich habe den Code aus dem Netz und versuche damit zu verstehen, wie csv2SQL funktioniert. Bei dem Beispiel ist nur die Ausgabe in php angedacht und kein Import nach SQL
|

10-09-2010, 21:18
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Die for-Schleife ist vermutlich unsinnig, denn damit würdest du ja für jede Spalte aus der CSV-Datei ein neues INSERT-Statement machen - aber eigentlich willst du doch wohl die Daten aus einer Zeile auch als einen Datensatz einfügen, oder?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

10-09-2010, 21:35
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
ja, sorry..hab dabei die hälfte vergessen, bzw. weggelassen.
PHP-Code:
$sql="INSERT INTO tbl_basis (datum,ip,url) VALUES ('$data[$c]'...)";
Denn da fängt das Problem auch schon wieder an..wie kann ich einzeln auf die Arrays zugreifen
|

10-09-2010, 21:50
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Das sind Grundlagen - schau ins Handbuch, oder lies ein Tutorial.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

10-09-2010, 22:46
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
Zitat:
Zitat von wahsaga
Das sind Grundlagen - schau ins Handbuch, oder lies ein Tutorial.
|
eiskalt abgeschmettert. Da traut sich wohl keiner mehr nen Tipp zu lassen. schade.
Ich bin auch eher davon ausgegangen, dass ich mit Explode die Werte aus der csv "zerstückeln" müsste und so einfacher an die Arrays komme.
Geändert von argonsputter (10-09-2010 um 22:49 Uhr)
|

10-09-2010, 23:19
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 25.236
|
|
Zitat:
Zitat von argonsputter
eiskalt abgeschmettert.
|
Nein - ganz normal darauf hingewiesen, dass du dich ein wenig mit den Grundlagen beschäftigen musst, wenn du sowas umsetzen willst.
Zitat:
Ich bin auch eher davon ausgegangen, dass ich mit Explode die Werte aus der csv "zerstückeln" müsste und so einfacher an die Arrays komme.
|
Unfug, fgetcsv liefert dir doch bereits ein Array, das für jede Spalte eines Datensatzes ein Element enthält.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

11-09-2010, 11:00
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
Zitat:
Zitat von wahsaga
Die for-Schleife ist vermutlich unsinnig, denn damit würdest du ja für jede Spalte aus der CSV-Datei ein neues INSERT-Statement machen - aber eigentlich willst du doch wohl die Daten aus einer Zeile auch als einen Datensatz einfügen, oder?
|
Richtig, aber ich muss die Arrays in der For-Schleife hochzählen, um diese im Sql String zu verarbeiten...oder muss ich dies ganz manuell hochzählen?
PHP-Code:
$sql="INSERT INTO tbl_basis (datum,ip) VALUES ('$data[0]', '$data[1]')"; $sqlinsert=mysql_query($sql);
ich meine so funktioniert es, aber was, wenn die arrays unterschiedlich lang sind? zB. eine Zeile geht bis $data[33] und die andere bis $data[99] ?
Geändert von argonsputter (11-09-2010 um 11:13 Uhr)
|

11-09-2010, 11:18
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 3.611
|
|
Dann ist die CSV-Datei kaputt. Eine Zeile sollte immer gleich viel Werte haben.
|

11-09-2010, 15:08
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
Zitat:
Zitat von h3ll
Dann ist die CSV-Datei kaputt. Eine Zeile sollte immer gleich viel Werte haben.
|
ah, ok. Ich bin vom Worst Case ausgegangen.
Ferner habe ich noch eine Frage zu dem Auslesen der CSV. Ich möchte die Daten bis zu einem bestimmten Wert eintragen lassen. Klappt auch soweit mit:
PHP-Code:
/* Inhalt der statistik.csv
01.08.2001#62.159.232.250#www.selfphp3.de
02.08.2001#212.82.34.222#www.selfphp4.de
Stop#Stop#Stop
02.08.2001#http://suchen.abacho.de#62.159.232.250
03.08.2001#http://www.fireball.de#212.185.44.15
*/
if ($data[0]!= 'stop')
{
$sql="INSERT INTO tbl_basis (datum,ip) VALUES ('$data[0]', '$data[1]')";
$sqlinsert=mysql_query($sql);
}
else {
echo "stop gefunden!!"; //zum Debuggen
echo $data[0];
break;
}
Der Sinn dabei ist, alle Daten nach diesem "Stop" Eintrag in eine andere Tabelle einzutragen. Müsste ich nicht nochmal eine while schleife starten, die eine geändert if abfrage hat..
PHP-Code:
if ($data[0]== 'stop')
{
$sql="INSERT INTO tbl_basis_2 (datum,ip) VALUES ('$data[0]', '$data[1]')";
}
Was meint ihr dazu? Schmutzige Lösung?
|

12-09-2010, 14:04
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
Das wars natürlich nicht  hier meine Verbesserung...
Ich fange also die $row in der " Stop" Zeile ab, speichere diese und starte eine neue While Schleife mit der csv Datei, um direkt auf diese $row zu kommen. Dann erfolgen die Einträge in eine andere Tabelle.
Hab extra nicht die Edit Funktion benutzt, damit die Änderung deutlich wird.
Bitte um Meinungen zu dem Code, ob es so "logisch" ist. Danke
PHP-Code:
$row = 1;
$handle = fopen ("statistik.csv","r");
while ( ($data = fgetcsv ($handle, 1000, "#")) !== FALSE ) { // Daten werden aus der Datei
$num = count ($data);
$row++;
echo "<br>";
if ($data[0]!= 'stop')
{
$sql="INSERT INTO tbl_basis (datum,ip) VALUES ('$data[0]', '$data[1]')";
$sqlinsert=mysql_query($sql);
}
else {
echo "Stop gefunden in Zeile:". $row . "<BR>";
$row=$stopgefundenrow;
$stop_gefunden=1;
break;
}
} //while
if ($stop_gefunden==1)
{
while ( ($data = fgetcsv ($handle, 1000, "#")) !== FALSE ) {
$num = count ($data);
$row++;
If ($row<$stopgefundenrow)
{continue;
}
$sql_stop="INSERT INTO tbl_basis_2 (datum,ip) VALUES ('$data[0]', '$data[1]')";
$sqlinsert=mysql_query($sql_stop);
echo "<BR>";
}
}
fclose ($handle);
|

12-09-2010, 14:22
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 3.296
|
|
Ich kann mir beim besten Willen nicht vorstellen, wozu das "Stopp Gedöns" gut sein soll!
Auf mich macht es den Eindruck eines gruseligen Normalisierungsfehlers.
|

12-09-2010, 15:04
|
argonsputter
Registrierter Benutzer
|
|
Registriert seit: Jul 2007
Beiträge: 9
|
|
Zitat:
Zitat von combie
Ich kann mir beim besten Willen nicht vorstellen, wozu das "Stopp Gedöns" gut sein soll!
Auf mich macht es den Eindruck eines gruseligen Normalisierungsfehlers.
|
Nunja, in meiner CSV Datei kommt nach ca. 200 Zeilen ein bestimmter Eintrag (Codewort:Stop) und ab diesen Eintrag sollen alle folgenden Zeilen in eine andere Tabelle geschrieben werden.
|

12-09-2010, 15:15
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 3.296
|
|
1. ist es dann keine CSV Datei mehr
2. habe ich dich sehr wohl verstanden
3. Wozu soll das gut sein?
4. halte ich es für einen gruseligen Normalisierungsfehler
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Thema bewerten |
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|