php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.04.2006, 08:52  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard TXT Zeilenweise in MySQL einlesen

Hallo,

ich habe eine Rechtschreibprüfung rogrammiert. Und wie jede Prüfung benötigt auch diese ein Wörterbuch. Also habe ich mir ein kostenloses Wörterbuch organisiert. Das gibts auch gleich in mehreren Sprachen. (DE, AT, CH, EN, USA, etc). Also möchte ich in meinem CMS anbieten, dass sich jeder die Sprachen installieren kann, die er auch benötigt.

Die Sprachdateien sind zwischen 1-3 MB groß und in jeder Zeile steht ein Wort.

Meine Datenbank ist einfach aufgebaut:

ident | wort | sprache

Wenn ich allerdings jetzt Die Datei per PHP öffne und Zeile für Zeile auslese und in die Datenbank schreibe benötigt mir mein Rechner knapp 7 Minuten für die deutsche Datei (ca. 2,5 MB, 84067 Wörter). Was jetzt etwas schlecht ist, denn am Endserver habe ich ein Zeitlimit von 60 Sekunden. Und außerdem glaubt jeder Kunde, dass das Script abgestürzt ist, wenn man 5 Minuten keine Rückmeldung hat.

Ich weiß jetzt leider nicht wie ich dieses Problem umgehen kann, oder ob es in MySQL irgendeine andere Möglichkeit gibt, die Datei einzulesen.

Wie kann ich also eine so große Datei in die Datenbank einlesen, wobei jede Zeile ein neuer Datensatz ist?

Danke,
Stefan
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.04.2006, 08:57  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

PS: Ich arbeite mit MySQL 4.1 und PHP 5.
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline  
Alt 24.04.2006, 09:04  
Erfahrener Benutzer
 
Registriert seit: 21.12.2004
Beiträge: 5.235
PHP-Kenntnisse:
Fortgeschritten
mepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblickmepeisen ist ein wunderbarer Anblick
mepeisen eine Nachricht über ICQ schicken mepeisen eine Nachricht über Skype™ schicken
Standard

Du könntest vorab lokal bei dir die Datei nach Alphabet splitten, also jeden Buschstaben einzeln aufführen, oder auch beispielsweise immer 10000 Wörter auf einmal. Das würde dann eventuell die Verarbeitungszeit minimieren und mit dem Hinweis, dass es etwas Geduld erforderlich ist, geht es etwas. Zudem kannst du durch die dann nötigen Refreshs sicherstellen, dass der Kunde sieht, wie es voran geht, also immer sieht "Das Ding ist bei Buschstabe B, aha, nun ist es bei C".
__________________
www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks
Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih
mepeisen ist offline  
Alt 24.04.2006, 10:05  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Danke für die Idee.

Problem bei der Sache sind jetzt allerdings Sprachen wie Arabisch, Japanisch oder so. Da hab ich keinen Plan mit Buchstaben. Das CMS ist aber so ausgelegt, das der Kunde selbst die Sprachen seiner Homepage wählt (also 100% mehrsprachig) und deswegen sich auch die verschiedenen Wörterbücher runterladen kann.

Allerdings werde ich einen Weg finden müssen, die Dateien aufzusplitten und auf mehrmals zu bearbeiten. Ich versuche auch gerade mit mysqli->prepare() und mysqli->bind_param() zu arbeiten und da noch was an speed rauszuholen.

Aber ich hab noch keine messbaren Erfolge zu verzeichnen.

Um weitere Vorschläge und Ideen wäre ich dankbar.
Stefan
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline  
Alt 24.04.2006, 11:11  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Wie wärs wenn du einfach standardmäßig alle Sprachen mit einem Importscript
in die Datenbank Importierst (Per Task/Cronjob) und dann für die Kunden nur noch die Referenz zur importierten Sprache speicherst.
Mir ist generell suspekt, dass anscheinend jeder Sprachimport auf Seiten des Kunden einen neuen Importprozess auslösen soll. Dann müsstest du ja jede Sprachdatenbank für jeden Kunden einzeln speichern.

// edit:
Folgendes noch:
Mach eine Tabelle sprachen mit sprachID und sprachbezeichnung
Dann eine Tabelle woerter mit wortID,sprachID,wort
Weiter eine Tabelle kunden mit kundenID,vorname, nachname etc.
Und eine Verknüpfungstabelle KundenSprachen mit kundenID, sprachID
Andreas ist offline  
Alt 24.04.2006, 11:45  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Hallo,
vielleicht hab ich mich noch etwas unverständlich in der Beschreibung ausgedrückt.

Es gibt pro Homepage einen Admin, der für die Verwaltung (und somit auch für die Wörterbücher) zuständig ist. Nicht jeder Benutzer in der Homepage benutzt das geliche Wörterbuch. Die Homepages liegen teilweise auf verschiedenen Servern und benutzen verschiedene Sprachen. Die eine Homepage hat nur Deutsch, die andere hat noch Spanisch und Englisch und die weidernächste hatz.B. nur Japanisch und Türkisch (soeine hab ich wirklich!).

Jetzt bekommt der Admin ein Installverzeichnis auf den Server gelegt und kann darüber das CMS installieren. Diese Installdateier erstellen auf dem Server alles was man zum Arbeiten braucht. Es holt die aktuellen Dateien per FTP, richtet die Datenbank ein und erstellt die Verzeichnisstruktur, etc. Dort werden die gewünschten Wörterbuch als TXT-Datei mitgeliefert. Und jetzt muß nur noch die Datei in die Datenbank eingelesen werden. Alle Wörterbüch möchte ich nur ungerne als MYS-Dump hinterlegen, da ich bei insgesammt 15 Wörterbüchern die ich derzeit habe und pro Wörterbuch ca. 80000 Vokabeln bei einer Menge overhead in der Datenbank bin. Denn warum Spanisch einlesen wenn nur Deutsch und Englisch benutzt werden.

Deswegen die Lösung mit der Datei. Weil die von extern kommt und bei der CMS-Installation einfach mitkopiert wird. Und man könnte bei der Änderung der Rechtschreibung (Was ja manchmal vorkommt) auch eine neue Datei herunterladen und sein Wörterbuch mit der passenden Sprache updaten.

Die Tabelle der Sprachen gibt es schon.
Die Tabelle des Wörterbuches kann nicht auf die Sprachtabelle verweisen, da es für die Sprache mehr "Dialekte" gibt. z.B. Deutsch, Deutsch alte Rechtschreibung, Deutsch aus Österreich (Englisch, USA, etc)
Die Kundentabelle brauche ich nicht, da die Kunden auf verschiedenen Datenbanken arbeiten, bzw alle Benutzer das gleiche Wörterbuch haben. Alle Admins sind ja gleichberechtigt und am wohle der Seite interessiert. Andere Benutzer bekommen keinen Zugriffe aufs Wörterbuch.

Danke,
Stefan
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline  
Alt 24.04.2006, 11:59  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Naja in dem Fall (ich halts immernoch nicht für sinnvoll) wäre vielleicht
LOAD DATA INFILE interessant.
Such mal im Handbuch.

Verstehe auch nicht, warum dein CMS-Server nicht einfach die Daten ALLER Wörterbücher bereitstellt. Dann könnte dein Importscript einfach auf den CMS-Server, dort die Daten holen und direkt importieren. Ohne Dateien oder Ähnliches.
Andreas ist offline  
Alt 24.04.2006, 12:12  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Nenja, meine CMS liegen auf insgesammt 5 Servern verteilt.

Aber in einen Punkt hast du Recht. In meinem Script noch ne zweite Con zu einer Externen Datenbank aufzubauen sollte nicht das Problem sein. Dafür ist es ja Internet. Und wenn dieser Benutzer in der DB nur nicht localhost und nur SELECT-Rechte hat, dann dürfte auch da keine Gefahr bestehen.

Was tun bei eigenen Wörtern (z.B. die Band Taktfoll, die natürlich Ihren Bandnamen in der Prüfung haben möchte, aber das kein Standardwort werden soll)? Da könnte man dann noch ne Homepageeigene Datenbank hinzufügen und zusätzlich abfragem.

Ich gaub den Weg nehm ich!

LOAD DATA INFILE ist wegen der Struktur der Datei unpassend. Aber auch da könnte man am Dateiformat arbeiten.

Danke,
Stefan
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline  
Alt 24.04.2006, 12:48  
Erfahrener Benutzer
 
Benutzerbild von Andreas
 
Registriert seit: 22.04.2005
Beiträge: 391
Andreas ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Naja die Struktur der Dateien ist doch deine Angelegenheit. Strukturiere Sie um. Und zwar so, dass es passt.

Aber ich würde auch den SQL-Server Weg vorschlagen.
Andreas ist offline  
Alt 24.04.2006, 12:59  
Erfahrener Benutzer
 
Benutzerbild von stefanjann
 
Registriert seit: 02.08.2005
Beiträge: 252
PHP-Kenntnisse:
Fortgeschritten
stefanjann
Standard

Da mein japanisch jetzt nicht gerade das Beste ist, bekomme ich die Dateien von extern. Die müsste man dann auch erst umschreiben lassen. Und das ich jetzt keine eigenen Sprachgelehrten habe, sondern mich auf an einer Verteilerliste gegen (sehr) geringe Gebühr beteilige werden die am Format für mich nichts ändern.

Der SQL-Weg geht eigentlich schon recht gut. Meine Beta-Version hat nur noch etwas ladezeitenprobleme und die Schnittstelle ist noch ausbaubedürftig. Aber der Weg ist gut und wird genommen.
__________________
SELECT * benutze ich nur um den Post kurz zu halten.
stefanjann ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] MySQL - ERROR 1044 bei erstellen einer Datenbank _youngenterpriser_ Datenbanken 2 05.02.2008 17:56
Mysql Server Einstellunen Optimieren pchero Datenbanken 3 01.05.2007 19:50
MySQL per PHP zeilenweise löschen... PHP Tipps 2006 7 21.02.2006 15:29
[Erledigt] Mysql 4.1.x unter php 4.3.9 Datenbanken 3 15.11.2005 13:49
Text File zeilenweise einlesen PHP Tipps 2005-2 6 07.10.2005 09:38
Daten einlesen MySQL und PHP PHP Tipps 2005-2 10 28.09.2005 15:42
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
txt - Zeilenweise einlesen bendigo PHP Tipps 2005-2 13 03.08.2005 18:27
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
checkfelder in mysql einlesen u wieder ausgeben PHP Tipps 2005-2 3 06.06.2005 14:36
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
[Erledigt] Textdateien in MySQL einlesen Datenbanken 1 06.12.2004 13:27
Access denied for user: '@localhost' / SYSTEM@localhost Datenbanken 0 10.11.2004 20:35
[Erledigt] PHP5 &a m p; MySQL Datenbanken 5 01.08.2004 05:47
einlesen von .txt file in deine Tabelle unter MySQL Datenbanken 1 16.06.2004 14:14

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql text zeilenweise, php textdatei zeilenweise in mysql-tabelle, txt in mysql einlesen, textdatei zeilenweise in mysql einlesen, textdatei mysql zeilenweise einlesen, wörterbuch mit mysql, text zeilenweise in mysql, zeilenweise einlesen mysql, .txt wörter per php in mysql, .txt datei in mysql datenbank einlesen, php textdatei zeilenweise in datenbank einlesen, text datei in mysql mit php kriegen, sql server datei zeilenweise einlesen, textdatei zeilenweise in mysql, http://www.php.de/php-tipps-2006/39369-txt-zeilenweise-mysql-einlesen.html

Alle Zeitangaben in WEZ +2. Es ist jetzt 14:53 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.