.txt zeilenweise lesen & löschen
Roland
- php
Hi!
Ich hab eine Textdatei und möchte diese Daten in eine MySQL-Datei importieren. Ich dachte mir, dass ich um den Speicher zu schonen (65 000 Zeilen) die Datei zeilenweise einlesen und die Zeile gleich wieder löschen lasse (die Datei verarbeitet, um nicht die maximal-Zeit zu überschreiten immer 1000 Zeilen ab).
Eine (erfundene) Zeile würde z.B. so aussehen:
Herr Thomas Maier Bummerstrasse 34a 45376 Bummental 0431 57645656 0431 54654555 ThomasMaier@bummerhost.de
Mein Ansatz war dieser:
$handle = fopen ("file.txt", "r");
for(i=0; i<1000; i++) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$data = explode(" ", $buffer);
## Herr/Frau
if($data[0]=="Herr") $data[0] = 1;
elseif($data[0]=="Frau") $data[0] = 0;
else die('Fehler bei der Verarbeitung');
## schon vorhanden?
$result = mysql_query("SELECT email_adress FROM ".$tablename." WHERE email_adress='".addslashes($data[14])."'");
if($result) echo addslashes($data[14])." ist bereits eingetragen<br>";
else {
$query = "INSERT INTO ".$tablename." (male, firstname, lastname, streetadress, streetnumber, postcode, city, area_code1, phone1, area_code2, phone2, area_code_fax, fax, email_adress)".
"VALUES ('".addslashes($data[0])."', '".
addslashes($data[1])."', '".
addslashes($data[2])."', '".
addslashes($data[3])."', '".
addslashes($data[4])."', '".
addslashes($data[5])."', '".
addslashes($data[6])."', '".
addslashes($data[7])."', '".
addslashes($data[8])."', '".
addslashes($data[9])."', '".
addslashes($data[10])."', '".
addslashes($data[11])."', '".
addslashes($data[12])."', '".
addslashes($data[13])."', '".
addslashes($data[14])."')";
$result = mysql_query ($query) or die ("Der Datenbankeintrag hat leider nicht funktioniert.");
}
}
}
fclose ($handle);
Kann dies funktionieren?
Wie kann ich denn die eingelesene Zeile löschen???
danke
Roland
Hellihello
fgets liest doch zeilenweise ein. Warum willst du denn da was löschen?
Dank und Gruß,
weil ich mit einem PHP-Aufruf ned 65.000 Zeilen einlesen kann => 130.000 MySQL-Abfragen.
Deshalb lass ich immer nur 1.000 Abfragen / Aufruf durchführen, damit er jetzt aber speichert welche er schon erledigt hat, möcht ich die verwendeten rauslöschen!
lg
Roland
Hi,
weil ich mit einem PHP-Aufruf ned 65.000 Zeilen einlesen kann => 130.000 MySQL-Abfragen.
und was von den Aktionen des Scripts kostet die Zeit?
Deshalb lass ich immer nur 1.000 Abfragen / Aufruf durchführen, damit er jetzt aber speichert welche er schon erledigt hat, möcht ich die verwendeten rauslöschen!
Du kannst dem Script auch mitteilen, ab welcher Zeile der Datei er fortfahren soll. Oder den Zeitfresser eliminieren.
Cheatah
Ich weiß nicht ob es wirklich so ist, aber ich hatte vermutet, dass mir der Server den Process killt, wenn ich 130.000 MySQL-Abfragen mache!?
Die RAM-Nutzung bleib eh sehr gering.
lg
Roland
Hi,
Ich weiß nicht ob es wirklich so ist, aber ich hatte vermutet, dass mir der Server den Process killt, wenn ich 130.000 MySQL-Abfragen mache!?
dann mach doch einfach weniger. Die Anzahl lässt sich mit einer einzigen, offenbar zwingend notwendigen Reparatur am Datenbank-Layout halbieren; und anschließend (theoretisch) noch einmal auf ein Fünfundsechzigtausendstel reduzieren. Dazu ist es lediglich nötig, in der Dokumentation Deines DBMS' die Syntax der von Dir verwendeten Statements zu studieren.
Die RAM-Nutzung bleib eh sehr gering.
Sie wird dabei etwas steigen.
Cheatah
Hi,
Wie kann ich denn die eingelesene Zeile löschen???
die meisten Dateisysteme haben die Fähigkeit, eine Datei zu löschen (oder etwas zu tun, das sich so bezeichnen lässt). Sie haben *nicht* die Fähigkeit, textverarbeitende Aktionen durchzuführen. Um in einer Datei eine Zeile zu löschen, musst Du sie komplett[1] einlesen und ohne diese Zeile wieder komplett[1] neu schreiben. Ginge es anders, wäre es kein Dateisystem, sondern eine Datenbank.
Darüber hinaus ist es für das Einfügen von Daten in eine Datenbank nicht nötig, die Quelle zu eliminieren; beachte also frankx' Hinweis.
Cheatah
[1] Bzw. mindestens ab der betreffenden Stelle in der Datei.
ok, stimmt.
Hast du vielleicht ne Ahnung wieviele Abfragen ohne Probleme auf nem Server funktionieren sollten?
Dann werd ich die Datei einfach händisch teilen...
Passt mein Skript sonst laut eurer Meinung (bin noch nicht soo erfahren).
Vielen Dank!
Roland
Hi,
Hast du vielleicht ne Ahnung wieviele Abfragen ohne Probleme auf nem Server funktionieren sollten?
nein. Die Grenze ist keine Anzahl Aktionen, sondern eine Anzahl Sekunden. Ich habe keine Ahnung, welche Aktionen auf Deinem System durchschnittlich wie lange dauern; und selbst wenn ich das wüsste, könnte ich nicht auf den Einzelfall schließen.
Dann werd ich die Datei einfach händisch teilen...
Du kannst sie auch automatisiert teilen.
Passt mein Skript sonst laut eurer Meinung (bin noch nicht soo erfahren).
Es basiert auf einem Konzept, welches offenbar zu viel Zeit benötigt.
Cheatah
Es basiert auf einem Konzept, welches offenbar zu viel Zeit benötigt.
???
Was soll ich ändern, was passt nicht?
Das sagt recht wenig.
Wie kommst du auf "offenbar zu viel Zeit", habs noch nicht getestet. Falls du der Ansicht bist, wäre es super wenn du das erläutern könntest...
lg
Roland
Hi,
Was soll ich ändern, was passt nicht?
Das sagt recht wenig.
jeder Roundtrip kostet Zeit. Der zu einem SQL-Server nicht weniger als der zu einem HTTP-Server (beispielsweise). Du versuchst, zigtausende Roundtrips vorzunehmen - das kostet zu viel Zeit.
Wie kommst du auf "offenbar zu viel Zeit",
Eine solche Beschränkung lässt sich bei PHP vom Administrator trivial konfigurieren, was ein übliches Vorgehen besonders bei Hostern der preiswerteren Art ist.
Cheatah
Hallo
else die('Fehler bei der Verarbeitung');
die() ist keine Fehlerbehandlung. In diesem Fall erst recht nicht.
## schon vorhanden?
$result = mysql_query("SELECT email_adress FROM ".$tablename." WHERE email_adress='".addslashes($data[14])."'");
Vorher zu prüfen, ob Daten schon vorhanden sind, ist eine denkbar schlechte Idee. Es gibt eindeutige Indexe und verarbeitbare Fehlermeldungen des DBMS.
if($result) echo addslashes($data[14])." ist bereits eingetragen<br>";
addslashes() ist eine der überflüssigsten und untauglichsten PHP-Funktionen. Aus welchem Grund wendest Du hier addslashes() an? Was möchtest Du damit erreichen?
$query = "INSERT INTO ".$tablename." (male, firstname, lastname, streetadress, streetnumber, postcode, city, area_code1, phone1, area_code2, phone2, area_code_fax, fax, email_adress)".
"VALUES ('".addslashes($data[0])."', '".
Hier wäre mysql_real_escape_string() die angemessene Funktion. addslashes() ist es jedenfalls nicht.
$result = mysql_query ($query) or die ("Der Datenbankeintrag hat leider nicht funktioniert.");
Führe eine Protokolldatei statt das Skript sterben zu lassen.
Kann dies funktionieren?
Nur mit viel Glück und aus reinem Zufall.
Wie kann ich denn die eingelesene Zeile löschen???
Wozu?
Frage: Hast Du schon einmal etwas von CSV-Dateien gehört?
Inwieweit könnte Dir CSV weiterhelfen?
Freundliche Grüße
Vinzenz