Comment faire pour importer énorme fichier CSV avec 200,00 lignes de MySQL (asynchrone et rapide)?
Je dois écrire un script PHP qui va importer des données à partir d'un fichier CSV en base de données MySQL. Le fichier CSV peut contenir jusqu'à 200 000 lignes.
J'ai essayé ce qui suit, mais des problèmes se posent :
- LOAD DATA LOCAL INFILE : je ne peux pas utiliser LOAD DATA LOCAL INFILE déclaration parce que je voulais faire un peu de validations d'abord AVANT de télécharger les lignes, aussi, notre DB admin ne veut pas me servir de cette déclaration, et je ne sais pas pourquoi.
- POUR la BOUCLE : l'Insertion d'une ligne par ligne à l'intérieur DE la boucle va prendre trop de temps d'attente de la Connexion.
Maintenant, je pense à une solution par le fractionnement du fichier CSV en petits morceaux, puis de les insérer de manière asynchrone. Je me suis déjà fait avec le fractionnement du CSV, mais je n'ai actuellement aucune idée de comment de façon asynchrone insérer dans ma base de données de façon rapide et sécuritaire. Mais j'ai entendu dire que je serai à l'aide d'Ajax ici.
Toute solution que vous pouvez recommander? Merci beaucoup à l'avance!
LOAD DATA LOCAL INFILE
, il suffit de créer un trigger sur la table dans laquelle vous ne l'importation et de laisser le déclencheur de faire les validations.200k lignes est minuscule pour load data local infile, on dirait que le chemin à parcourir. Vous pouvez également faire des validations avant et ré-écrire le fichier avant de l'importer.
Je comprends que LOAD DATA LOCAL INFILE est la meilleure façon d'aller. Si c'est juste mes critères, je voudrais le faire de cette façon. Mais je suis chargé de le faire de manière asynchrone. Aussi, je n'ai pas accès à la modification de notre base de données. Vraiment, mon boss m'a demandé d'écrire un script PHP qui se charge de ces lignes dans des bases de données MySQL. Quelle est la meilleure façon suivante pour LOAD DATA LOCAL INFILE?
Pourquoi est-ce que votre patron vous demandant de le faire via PHP? Semble comme il devrait être quelque chose comme MySQL Workbench, avec de nombreux records.
OriginalL'auteur Mead Umandal | 2015-09-10
Vous devez vous connecter pour publier un commentaire.
Merci à tous ceux qui ont donné des réponses à cette question. J'ai trouvé une solution!
Je voulais juste partager, au cas où quelqu'un a besoin de créer un script PHP qui va importer un énorme fichier CSV en base de données MySQL (de manière asynchrone et rapide!) J'ai testé mon code avec 400 000 lignes et l'importation est effectuée en quelques secondes.
Je crois qu'il serait de travailler avec des fichiers plus volumineux, vous avez juste à modifier de téléchargement maximale de la taille du fichier.
Dans cet exemple, je vais être de l'importation d'un fichier CSV qui contient deux colonnes (nom, contact_number) dans une base MySQL qui contient les mêmes colonnes.
Votre fichier CSV doit ressembler à ceci :
Ana, 0906123489
Jean, 0908989199
Pierre, 0908298392
...
...
Alors, voici la solution.
Tout d'abord, créez votre table
Deuxième, j'ai 4 fichiers PHP. Tout ce que vous avez à faire est de placer cela dans un seul dossier. Les fichiers PHP sont comme suit :
index.php
connect.php
senddata.php
upload.php
Que c'est! Vous avez déjà un pur script PHP qui peut importer plusieurs nombre de lignes en quelques secondes! 🙂
(Merci à mon partenaire qui a enseigné et m'a donné une idée sur la façon d'utiliser ajax)
regardez fgetcsv($handle, $batchsize, ';') il a travaillé pour moi
quelqu'un a idée pour ajouter un en-tête dans chaque minpoints$row.csv et de les ignorer dans les importations ?
Cela fonctionne parfaitement ! Merci!!!! Mais Comment je peux importer CSV lorsque la ligne de ressembler à ça : "Ana", "0906123489"
OriginalL'auteur Mead Umandal
Le principal lenteur vient de l'envoi de chaque ligne de sa propre demande. Je suggère d'envoyer la requête avec tous les 1000 ou 500 lignes dans le même format utilisé par
mysqldump --opt
, afin de construire une longue chaîne dans la façonVous devriez vérifier combien de temps vos lignes sont autorisés à l'être ou si la base de données MySQL - Server est sous votre contrôle vous pouvez étendre au maximum la longueur des requêtes.
Si c'est encore trop long (je veux dire 200K n'est pas beaucoup du tout), alors vous pouvez essayer d'améliorer le csv de la lecture.
C'est un peu de travail de fractionnement dans ces morceaux, mais vous pouvez écrire un petit morceau de la classe pour ce, afin d'ajouter les lignes devient un peu plus facile.
L'utilisation de cette classe ressemblait
OriginalL'auteur flaschenpost
Je serais encore utiliser LOAD DATA LOCAL INFILE dans une table temporaire et l'utilisation de MySQL pour valider, le filtre, le nettoyer, etc avec toutes les données dans une base de données, puis de renseigner la table de destination avec le prêt à aller enregistrements.
LOAD DATA LOCAL INFILE
.Aussi loin que je me souvienne,
LOAD DATA INFILE
fonctionne uniquement dans les configurations sans réplication, de sorte que la plupart des installations dans plus de demandes de mourir (réplication est utile pour générer des sauvegardes, pour le basculement et pour d'autres choses). La table temporaire est une bonne idée de toute façon, de sorte que vous pouvez faire plus complexe vérifie très facilement avant de pousser des données dans la table réelle.OriginalL'auteur Julio Soares
Vous pouvez utiliser fgetcsv() de PHP.
Voici un exemple :
[Augmentation] (php.net/manual/en/function.set-time-limit.php) le délai d'attente de 300 secondes
Ne faut-il pas que la " w "en fopen() être un "r"? Je viens de recevoir mon fichier d'entrée tronqué à zéro-longueur à l'aide de votre code... ou alors j'ai loupé quelque chose?
Vous devez utiliser R parce que vous n'avez pas besoin d'écrire dans le fichier. Si elle ne fonctionne qu'avec W, afin de l'utiliser.
OriginalL'auteur SatanicGeek