Textdatei einlesen
am 17.10.2004 20:10:30 von stefan.glaesser
Hallo,
ich habe eine Textdatei auf meinen Server hochladen und wollte
diese mittels Script in eine Datenbank importieren.
Leider brichte die Verarbeitung ohne Fehlermeldung ab. Es kommt
dann nur "Server wurde nicht gefunden". Allerdings kommt der Fehler
nur bei der originalen Textdatei (ca. 19MB) Specke ich die Datei
auf ca. 6MB (was anderes hab ich noch nicht probiert) ab, dann klappt
der Import.
Nach welcher Einstellung in der php.ini sollte ich also schauen?
Thx for hints
Re: Textdatei einlesen
am 18.10.2004 08:51:35 von Nico Haberzettl
Stefan Gläßer schrieb:
> Hallo,
Moin
> ich habe eine Textdatei auf meinen Server hochladen und wollte
> diese mittels Script in eine Datenbank importieren.
Was für eine Datenbank?
> Leider brichte die Verarbeitung ohne Fehlermeldung ab. Es kommt
> dann nur "Server wurde nicht gefunden". Allerdings kommt der Fehler
> nur bei der originalen Textdatei (ca. 19MB) Specke ich die Datei
> auf ca. 6MB (was anderes hab ich noch nicht probiert) ab, dann klappt
> der Import.
Hm. Benutzt du zum Import zufällig PHPMyAdmin? Das scheint ein Stolperstein
für grosse Imports zu sein, hab ich erst selbst erfahren müssen.
Tip: Axel Schwenkes Antwort auf meine Frage könnte auch die Antwort auf
deine Frage sein.
Der Thead heisst: "3MB-SQL-Befehl ausführen. Wie?" vom 11.10.
in den Google Groups:
http://groups.google.com/groups?q=Re%3A+3MB-SQL-Befehl+ausf% C3%BChren.+Wie%3F&hl=en&btnG=Google+Search
Lies erstmal den durch.
grüsse
Nico
--
adbu.de | AdressenKontakteNews | Ihr Infoportal
Re: Textdatei einlesen
am 18.10.2004 09:35:06 von stefan.glaesser
Nico Haberzettl wrote:
> Moin
Moin
> Was für eine Datenbank?
MySQL 4.0.18
> Hm. Benutzt du zum Import zufällig PHPMyAdmin? Das scheint ein Stolperstein
> für grosse Imports zu sein, hab ich erst selbst erfahren müssen.
Ich benutze ein eigenes Script, was beim Import der Textdatei
einige Validierungen vornehmen muss.
> http://groups.google.com/groups?q=Re%3A+3MB-SQL-Befehl+ausf% C3%BChren.+Wie%3F&hl=en&btnG=Google+Search
> Lies erstmal den durch.
hab ich, bringt mich leider nicht weiter :(
Ich durchlaufe die Textdatei zeilenweise, validiere jedes Feld und
wenn alles i.O. ist, füge ich den Datensatz ein. Meine SQL-Statements
werden also nicht wirklich groß.
Trotzdem danke,
Stefan
Re: Textdatei einlesen
am 18.10.2004 10:43:38 von Nico Haberzettl
Stefan Gläßer schrieb:
>
> hab ich, bringt mich leider nicht weiter :(
> Ich durchlaufe die Textdatei zeilenweise, validiere jedes Feld und
> wenn alles i.O. ist, füge ich den Datensatz ein. Meine SQL-Statements
> werden also nicht wirklich groß.
>
d.h. du hast je Zeile eine SQL-Query und führst in einer Schleife
jede einzelne Zeile aus?
Du hast war bei Inserts eigentlich nahezu keine return-daten, aber ich
würde
a) mal versuchen am Ende jedes Schleifendurchlaufs mysql_free_result()
durchzuführen (schuss ins blaue), um den Speicher freizugeben und
b) die max_allowed_packet (so glaube ich heisst die Option) in deiner
Mysql-Konfiguration zu erhöhen, in deinem Falle auf 20MB.
Oder du versuchst, wie Axel das beschrieben hat, mit system() (oder über
die shell) das File in die Datenbank zu quetschen.
grüsse
Nico
--
adbu.de | AdressenKontakteNews | Ihr Infoportal
Re: Textdatei einlesen
am 18.10.2004 11:04:26 von stefan.glaesser
Nico Haberzettl wrote:
> d.h. du hast je Zeile eine SQL-Query und führst in einer Schleife
> jede einzelne Zeile aus?
Ja genauso mache ich es.
> Du hast war bei Inserts eigentlich nahezu keine return-daten, aber ich
> würde
>
> a) mal versuchen am Ende jedes Schleifendurchlaufs mysql_free_result()
> durchzuführen (schuss ins blaue), um den Speicher freizugeben und
Leider ohne Erfolg.
> b) die max_allowed_packet (so glaube ich heisst die Option) in deiner
> Mysql-Konfiguration zu erhöhen, in deinem Falle auf 20MB.
Auch ohne Erfolgt.
> Oder du versuchst, wie Axel das beschrieben hat, mit system() (oder über
> die shell) das File in die Datenbank zu quetschen.
Geht leider nicht, weil ich das File wie gesagt vorher erst noch
validieren muss. Und das ist ziemlich aufwendig.
Gruss, Stefan
Re: Textdatei einlesen
am 18.10.2004 11:10:50 von Nico Haberzettl
Stefan Gläßer schrieb:
>> Oder du versuchst, wie Axel das beschrieben hat, mit system() (oder
>> über die shell) das File in die Datenbank zu quetschen.
>
>
> Geht leider nicht, weil ich das File wie gesagt vorher erst noch
> validieren muss. Und das ist ziemlich aufwendig.
>
Und wenn du erst Zeile für Zeile validierst, ohne zu insert'en
und dann, wenn alles gepasst hat, _nach_ der Schleife die Querys
mit system() reinstopfst?
grüsse
Nico
--
adbu.de | AdressenKontakteNews | Ihr Infoportal
Re: Textdatei einlesen
am 18.10.2004 11:57:49 von stefan.glaesser
Nico Haberzettl wrote:
> Und wenn du erst Zeile für Zeile validierst, ohne zu insert'en
> und dann, wenn alles gepasst hat, _nach_ der Schleife die Querys
> mit system() reinstopfst?
....
also das Problem ist folgendes:
Die Textdatei liegt zunächst als Zip-Archiv vor. Ich entpacke das
Script via
$output = exec('/usr/bin/unzip '.$absPath.$fileName.' -d /tmp');
print $output;
In einem Testscript steht dann "inflating: /tmp/xyz.txt"
Über str_replace hole ich mir dann den Dateinamen des entpackten
Files, da dieser immer variieren kann/soll. Diese Datei versuche
ich dann zu öffnen.
Im eigentliche Importscript sieht es dann quasi genauso aus, nur
dass die Anweisung ein bisschen später kommt und verschachtelter
steht.
switch ($fileExtension) {
case "zip": $output = exec('/usr/bin/unzip .$absPath.$fileName.'-d
/tmp');
print $output;
break;
case "txt": ...
}
Nur bekomme ich in diesem Konstrukt nicht mehr "inflating: /tmp/xyz.txt"
sondern "Archive: /home/user/importData/file.zip".
Ich kann den Fehler absolut nicht nachvollziehen. Und das beste daran
ist ja, dass der Code mit einem 1,3MB Zip-Archiv (6MB Text) funzt.
Wenn ich wüsste, wie ich den Dateinamen aus einem Zip-Archiv anders
bestimmen könnte, käme ich vielleicht auch weiter.
Gruss, Stefan
Re: Textdatei einlesen
am 18.10.2004 13:09:59 von Nico Haberzettl
Stefan Gläßer schrieb:
> Wenn ich wüsste, wie ich den Dateinamen aus einem Zip-Archiv anders
> bestimmen könnte, käme ich vielleicht auch weiter.
Muss ehrlich sagen, da bin ich auch überfragt, aber, wenn du
die Querys validieren und ausführen kannst, kannst du den Inhalt des
Files ja auch ausgeben. Und wenn du Ihne ausgeben kannst, kannst du
wohl auch den Output Buffer[1] verwenden, und dann den Inhalt des
Buffers in eine Datei deiner Wahl schreiben. Ich weiß zwar nicht, wie
der OB auf 19MB Daten reagiert, aber einen Versuch wäre es wert.
grüsse
Nico
[1] http://de.php.net/manual/en/function.ob-start.php
--
adbu.de | AdressenKontakteNews | Ihr Infoportal
OT: Textdatei einlesen
am 18.10.2004 20:13:36 von stefan.glaesser
Stefan Gläßer wrote:
> Nach welcher Einstellung in der php.ini sollte ich also schauen?
Ich hab das Problem beseitigen können. Es lag am Speicher. Ich musste
den Wert für memory_limit auf 50M erhöhen, dann lief es auch mit einem
Import von 18MB Rohdaten.
Gruss,
Stefan