RSS
 

Archive for the ‘PHP’ Category

Import CSV vers MySQL

11 déc

Voici un moyen d’importer un fichier CSV volumineux vers une base de données MySQL tout en évitant de se retrouver avec le message d’erreur suivant :
« Fatal error: Allowed memory size of 27340032 bytes exhausted (tried to allocate 5472 bytes) ».

Vous dépassez tout simplement la taille de la mémoire physique ou allouée par votre serveur.
Il est possible de modifier la valeur de la mémoire allouée par le serveur à l’aide de cette fonction:

ini_set("memory_limit",'2000M');

Mais si votre serveur ne possède qu’ un Go de mémoire RAM et que votre CSV fait 2 Go, il vous faut une autre méthode.
La solution suivante permet d’enregistrer à la volée chaque ligne du CSV et donc de ne pas saturer la mémoire en chargeant le fichier en cache.

<?php
	set_time_limit( 24 * 60 * 60 ); // Temps d'execution du script = 24H
	$ptr = fopen( $chemin_complet_fichier_csv, 'r' ); //Ouvrir le fichier csv
	for ($ligne = fgetcsv($ptr, 1024,';'); !feof($ptr); $ligne = fgetcsv($ptr, 1024,';'))  // Parcourir chaque ligne du fichier CSV
	{
		$mes_donnees['value1'] = $ligne[1]; //récupère la seconde occurrence après le séparateur
		$mes_donnees['value2'] = $ligne[2];
		$mes_donnees['value3'] = $ligne[3];

                //Requête SQL qui insère les données de la ligne
		$requete = "INSERT INTO maTable (`tb1 ,`tb2` ,`tb3` )
					VALUES ('".$mes_donnees['value1']."', '".$mes_donnees['value2']."', '".$mes_donnees['value3']."')";
	}
?>
 
No Comments

Posted in CSV, MySQL, PHP