kostenloser Webspace werbefrei: lima-city


Sehr grosse Dateien mit phpMyAdmin importieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    na-web

    na-web hat kostenlosen Webspace.

    Ich habe das Problem, dass ich zwei sehr grosse Datenbanken im CSV-Format habe. Diese speichere ich derzeit lokal auf meinem PC. Ich möchte diese nun nutzen und beide in zwei verschiedene Tabellen der selben Datenbank importieren. Ich habbe die beiden Tabellen in der Datenbank erstellt, funktioniert Prima. Nun möchte ich nur noch die Daten aus den Dateien importieren. Ich dachte miur, dass das doch kein Problem sein kann und habe versucht die importieren-Funktion zu verwenden. Jedoch kam dann nur die Meldung, dass die Datei wohl zu gross sei. Weiss jemand, was es noch für andere Möglichkeiten gäbe?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich schmeiß mal verschiedene Ideen in den Raum:

    1. Die Dateien auftrennen in kleinere Teile.
    2. Das Upload-Limit erhöhen, z.B. mit einer lokalen PHPMyAdmin Instanz und damit direkt auf die Lima-City DB zugreifen.
    3. Ein eigenes (PHP-)Skript schreiben, das die Daten aus der CSV-Datei liest und in die Datenbank übernimmt.

    Nur, um eine Vorstellung zu bekommen: Wie groß sind denn nun die CSV-Dateien? Also gemeint ist die Dateigröße und/oder die Anzahl der Datensätze.
  4. Autor dieses Themas

    na-web

    na-web hat kostenlosen Webspace.

    Hallo und schon mal danke für die Antwort. Die Dateien sind 67.9 MB und 47.5 MB gross. Leider verstehe ich nicht genau, was mit dem zweiten und dritten Punkt der Vorschläge gemeint ist, könntest man mir das noch etwas genauer erläutern (am besten mit passendem Codebeispiel)?
  5. Zu 2.:
    Ich hatte mir überlegt, lokal z.B. einen Apache mit PHPMyAdmin aufzusetzen. Du kannst dann das Upload-Limit in Apache und PHP (wo es vermutlich Probleme macht) selbst definieren und darüber die großen Dateien direkt in die externe DB bei Lima-City einspielen. Ich bin mir jedoch nicht sicher, wie es dabei mit der Performance aussieht, weil die Datenbankverbindung über eine große Strecke mit womöglich hohen Latenzen aufgebaut ist.

    Zu 3.:
    Du könntest per FTP die CSV-Datei auf den Webserver laden und ein PHP-Skript schreiben, das die CSV-Datei zeilenweise liest, parst (also die einzelnen Datenfelder extrahiert) und dann blockweise, z.B. immer 100 Datensätze gemeinsam in die DB einspielt.
    Zum Parsen der CSV-Datei gibt es wohl in PHP bereits Funktionen, jedoch habe ich damit keine Erfahrung.
    https://secure.php.net/manual/de/function.fgetcsv.php
    Und das Einfügen in die Datenbank geht mit MySqli oder PDO.
    Die genaue Implementierung hängt dann von dem Aufbau der Tabellen und der CSV-Dateien ab.
  6. Autor dieses Themas

    na-web

    na-web hat kostenlosen Webspace.

    Ich würde zur dritten Variante tendieren, ich habe die Dateien auch bereits auf dem Webserver. Jedoch kann ich mir immer noch nicht ganz vorstellen, wie ein solches Skript aussehen müsste. Kann man mir da vielleicht noch etwas konkreter helfen?
  7. Gut, ich hab den Fall einmal an einem einfachen Beispiel nachgestellt.

    Folgende CSV-Datei ist gegeben:
    1,Max,Mustermann
    2,Karl,Otto
    3,Friedrich,Schmidt
    Falls du in deiner Datei als erste Zeile Überschriften hast, solltest du diese entfernen oder in PHP extra behandeln.

    Nun habe ich folgende SQL-Tabelle erstellt:
    CREATE TABLE `personen` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `vorname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
      `nachname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


    Und jetzt kommt der PHP-Code, der die Daten hier einträgt:
    <?php
    // SQL Zugangsdaten
    $db = new PDO("mysql:host=localhost;dbname=db12345", "db-user", "db-password");
    
    // CSV Dateiname
    $csv_file = fopen("./data.csv", "r");
    
    function bulk_insert($db, $dataset) {
      $values = implode(",", $dataset);
      // Spaltennamen anpassen
      $query = "INSERT INTO personen (id, vorname, nachname) VALUES $values;";
      $db->query($query);
    }
    
    $lnr = 1;
    $dataset = [];
    
    // Anzahl der Spalten anpassen
    $expectedcolumns = 3;
    
    while (($line = fgetcsv($csv_file)) !== false) {
      if (count($line) == $expectedcolumns) {
        $fields = [];
        foreach ($line as $field) {
          $fields[] = $db->quote($field);
        }
        $dataset[] = "(" . implode(",", $fields) . ")";
        if (count($dataset) >= 100) {
          bulk_insert($db, $dataset);
          $dataset = [];
        }
      } else {
        echo "Error on line $lnr: Expected $expectedcolumns columns but found " . count($line) . "\n";
      }
      $lnr++;
    }
    if (count($dataset) > 0) {
      bulk_insert($db, $dataset);
    }
    
    fclose($csv_file);
    Die wichtigen Stellen im Skript, an denen du noch etwas anpassen musst, habe ich kommentiert.

    Ich hoffe, ich konnte damit weiter helfen.
  8. mein-wunschname

    mein-wunschname hat kostenlosen Webspace.

    Früher gab es für solche Sachen mal den MySQL-Dumper. Der wird leider nicht mehr gepflegt. Angeblich soll aber diese Version
    https://github.com/DSB/MySQLDumper
    an PHP 7 angepasst sein.
    Dann gibt es noch BigDump
    https://www.ozerov.de/bigdump/
  9. Autor dieses Themas

    na-web

    na-web hat kostenlosen Webspace.

    Danke für die Hilfe, ich habe das Skriptbeispiel verwendet (an den angegebenen Stellen angepasst) und das hat Prima geklappt. Meine Datenbanken sind nun auf dem MYSQL-Server, funktioniert genau wie geplant.

    Danke allen beteiligten für die Hilfe und noch einen schönen Tag

    Beitrag zuletzt geändert: 16.7.2018 16:58:49 von na-web
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!