Antworten auf deine Fragen:
Neues Thema erstellen

Textdatei sequentiell einlesen

sdressler

Noch nicht viel geschrieben

Ich stehe vor folgendem Problem:
Ich habe eine (sehr) große Datei (4GB) mit Zuordnungen (Tabelle aus 3 Spalten TAB getrennt)
diese würde ich gerne in eine MySQL-Datenbank übertragen. Durch das Timeoutlimit des Apache und php wird dies sicher nicht am Stück funktionieren.

--> meine Frage also <--

Kann man die Textdatei in kleineren Häppchen einlesen?
Wenn ja wie lässt sich das bewerkstelligen?

Meine Suche über Google blieb bisher erfolglos ...
(wahrscheinlich noch nicht den richtigen Suchbegriff gefunden)

Über jede Antwort wäre ich sehr dankbar

[Edit]habe gerade folgendes gefunden (TextWedge 1.2.1)
http://www.essential-freebies.de/board/viewtopic.php?p=87059
das könnte unter Umständen mein Problem verringern.[/Edit]
 
Zuletzt bearbeitet:

Adi100

Raindrops keep falling on my head *summt

AW: Textdatei sequentiell einlesen

Mit dem SplitterTool wirst du keinen Erfolg haben, der der trennt den Text wahllos an irgendeiner Stelle ab, d.h. wenn es sich um Datensätze handelt würde eventuell
die Strukture des einzelnen Datensatzes verletzt.
Hier würde ich eher mal versuchen einen Ansatz zufinden auf deinem Server Timeout ...
oder die Datei zuerst in einer lokalen Datenbank einlesen .

schön Gruss
 

Duddle

Posting-Frequenz: 14µHz

AW: Textdatei sequentiell einlesen

Hast du Shell-Zugriff auf den Server? Wenn ja, könntest du die Datei direkt darauf kopieren und die Daten direkt .
Weiterhin könntest du das Zeitlimit von PHP kurzzeitig ausschalten (per Servereinstellung), falls du das darfst / es die Admins erlauben.

Ansonsten hat mir Google gerade BigDump als Script für diese Zwecke ausgespuckt, das wird auch auf anderen Seiten referenziert.


Duddle
 

sdressler

Noch nicht viel geschrieben

AW: Textdatei sequentiell einlesen

Das wird sowieso auf einem lokalen Server (XAMPP) eingespeist.
Was das Splittool angeht sollte es kein Problem sein sofern es jede Zeile komplett lässt.
eine Zeile im Text entspricht einer Zeile in der Datenbanktabelle

in etwa so:
Nummer | Kategorie | Kategorienummer
1234 | QWERZ | ZTREWQ4321
1234 | QWERY | ZTREWY4521
1234 | QWARZ | ZTRAWQ9621
1234 | BWERZ | ZTREWB4367
--> so lange das Splittool die Zeilen zusammenhält also keine Probleme.
Die Frage war eigentlich ob das einlesen einer Datei immer von Zeile 0 - Z erfolgen muss oder ob man mittels php auch die Zeilen
0-10
11-20
21-30
...
S-Z
direkt laden kann ohne die komplette Datei zu laden.

mfg Sven
 

Duddle

Posting-Frequenz: 14µHz

AW: Textdatei sequentiell einlesen

Es kommt darauf an, wie der Dump geschrieben ist. In der Regel ist er aber so strukturiert, dass zuerst alle notwendigen Tabellen gelöscht, neu erstellt und wieder gefüllt werden. Da das jeweils einzelne SQL-Anweisungen sind, kannst du die auch (offensichtlich je Anweisung) einzeln und in Häppchen ausführen.

Nichtsdestotrotz solltest du dafür den Kommandozeilenbefehl nutzen, wenn du ihn schon hast.


Duddle
 

saila

Moderatorle

AW: Textdatei sequentiell einlesen

Hi,

am sinnigsten wäre es wie Duddle es vorgeschlagen hat. Allerdings gehe ich davon aus, dass du nicht die Zugangsrechte über die Console erhalten wirst/hast.

Du kannst es allerdings über ein script lösen. Das müsste allerdings als Formular aufgebaut werden, um das ganze in Schritten abzuarbeiten. Abgesehen davon umgehst du auch die die max. Laufzeit.

Vom Prinzip:
Im ersten Formular-Schritt die Quell-Datei bis max. 2000 Zeilen einlesen und die Daten in die DB übertragen. Danach in Schrit zwei den Parameter von 2000 um eins erhöhen und den gleichen Vorgang per Button starten.
Wichtig ist am Anfang die Gesamtzeilen aus der Quell-Datei auszulesen um doppelte Einträge in der DB zu vermeiden.

Eine weitere Variante wäre die Tab-Leerstellen mit einem ; zu versehen und als csv in die DB zu übertragen.

Eine weitere Möglichkeit wäre, ein fertiges Script über eine Suchmaschine zu finden ;)
 

sdressler

Noch nicht viel geschrieben

AW: Textdatei sequentiell einlesen

ich bin so schlecht im erklären.. *gg*
also
ich programmiere eine php Anwendung auf einem XAMPP auf einer Windowskiste.
Ich habe jetzt eine Liste von Daten die allerdings enorm große ist, so dass ich meinen Rechner überlaste sobald ich die komplette Datei im Editor öffne.
Der Inhalt dieser Datei besteht aus Tab-separierten Daten Pro Zeile.
jede Zeile davon soll nun in die MySQL-Datenbanktabelle (erstelle ich im gleichen Format).
Ein Skript zu schreiben, welches eine Datei ausliest sollte kein Problem darstellen (file_get_content()).
--> Allerdings lade ich die x1000-Zeilen (insg. 4GB Datei) in den Zwischenspeicher
--> Arbeitsspeicher und Zeitintensiv

Daher brauche ich ein Tool mit dem ich entweder die Eingabedatei verkleinere (durch zerteilen) oder ein gezieltes häpchenweises Einlesen der 4GB großen Datei.

Vielleicht fällt einem noch ne Lösung ein, würde mich freuen. Morgen werde ich mal die 4GB - Datei mit "TextWedge 1.2.1" zu zerteilen
 

Ravetracer

Hobbyfotograf

AW: Textdatei sequentiell einlesen

Machs doch mit fopen(), es liest nicht die ganze Datei ein.

Mal ein grobes Beispiel:
PHP:
   $f = fopen('myfile.txt','r');

   $cnt = 0; // oder 1, wie's beliebt
   $cnt_complete = 0; // für die gesamtausgabe
   $lines = array();
   while( !feof($f) ) {
        $lines[] = fgets($f);
        $counter++;
        $cnt_complete++;
        if( $counter >= 10 ) {
               ... sql-query mit $lines-inhalt erstellen und ausführen ...
               $lines = array();
               $counter = 0;
               echo $cnt_complete . " Datensätze abgearbeitet<br/>";
               flush();
        }
   }

   fclose($f);
Was hier noch nicht beachtet ist, sind die letzten Datensätze, wenn es weniger als 10 sind. Das muss man halt noch abfragen.
Ansonsten sollte das klappen. So hab ich das bisher auch gemacht.
Ein problem ist natürlich die Serverlaufzeit, aber da du das Script sowieso auf einen lokalen XAMPP laufen lässt, kommst du ja locker an die php.ini.

Ich hoffe, dass ich dir helfen konnte.
 

sdressler

Noch nicht viel geschrieben

AW: Textdatei sequentiell einlesen

Mit fopen hab ich noch nicht sehr viel gemacht aber wahrscheinlich läßt sich hierrüber die einlesearbeit sicher besser steuern...


*freu*
Ich habe ein Programm gefunden (> <) welches die Datei öffnen kann ohne den Arbeitsspeicher aus den Angeln zu heben also hier mal die Statistik für die Datein die in die DB übertragen werden sollen:

Dateigröße: 3.604.453 KB
Zeilen: 134.915.434

Oh weia das wird hartes Brot...
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben