Envoyer un fichier CSV dans une base

Signaler
Messages postés
12
Date d'inscription
lundi 10 janvier 2011
Statut
Membre
Dernière intervention
10 janvier 2011
-
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
Bonjour,
Dans le cadre d'une gestion RH pour une agence EDF, je dois mettre a jour une table qui contients tous les agents de l'agence gràce a un script PHP.
La liste des agents se trouvent dans un fichier .csv qui est généré tous les mois. Je n'utilise que certains champs du fichier CSV.
Pour cela j'ai créé un code qui génère une requete a partir du fichier.
Le problème c'est que le fichier contient plus de 6000 enregistrements et l'envoi de la requete INSERT est très longue, l'explorateur plante.
J'ai bien modifié la valeur du time limit dans php.ini.
Y a t-il une manière de procéder pour accélérer le processus?
PS : Mon site inclu le PDO

Voici mon code :

<?php

// Nom du fichier
$nomfichier=$_GET["nomfichier"];

// Ouverture du fichier
$file = fopen( $nomfichier, 'r' ); 

// Connection à la base
$connect = mysql_connect('localhost','root','');
mysql_select_db('bdd',$connect);
if (!$connect) {die('Connexion impossible : ' . mysql_error());}

// Parcours toutes les lignes
$i=0; 
$Insert="INSERT INTO `to_agent` VALUES ";

while ( ! feof( $file ) )
{
    $i++; // on incrémente le numéro de la ligne
$line = fgets( $file, 1024 );
if ( strlen( $line ) > 2 && $i>1 ) 
{
$line = addslashes( $line );
$donnees = explode(";", $line);	
if ($i==2)// Pour la 2ere ligne, la 1ere ligne est exclue
{
$Insert=$Insert."('$donnees[8]','$donnees[10]','$donnees[11]','$donnees[13]','$donnees[14]','$donnees[22]','$donnees[23]','$donnees[24]','$donnees[16]','$donnees[17]','$donnees[18]','$donnees[0]','$donnees[2]','$donnees[4]','$donnees[6]')";
}
else  // Pour le reste des lignes
{
$Insert=$Insert.",('$donnees[8]','$donnees[10]','$donnees[11]','$donnees[13]','$donnees[14]','$donnees[22]','$donnees[23]','$donnees[24]','$donnees[16]','$donnees[17]','$donnees[18]','$donnees[0]','$donnees[2]','$donnees[4]','$donnees[6]')";
}
}
}

$result = mysql_query($Insert);

?>

3 réponses

Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Regarde du côté de LOAD DATA INFILE

Cordialement,



Kohntark -
Messages postés
12
Date d'inscription
lundi 10 janvier 2011
Statut
Membre
Dernière intervention
10 janvier 2011

J'ai du mal a comprendre le fonctionnement du LOAD DATA INFILE.
Comment exclue t'on la 1ère ligne du fichier et comment détermine t'on quelle valeur d'une ligne on insert dans tel ou tel champ d'une table?
Merci
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Comment exclue t'on la 1ère ligne du fichier et comment détermine t'on quelle valeur d'une ligne on insert dans tel ou tel champ d'une table?


Heu, en lisant la doc du lien proposé juste avant :


The IGNORE number LINES option can be used to ignore lines at the start of the file. For example, you can use IGNORE 1 LINES to skip over an initial header line containing column names: ...



You can also discard an input value by assigning it to a user variable and not assigning the variable to a table column:

LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3);


Je ne saurai être plus clair que cette doc.
Maintenant, si tu rencontres des problèmes, fournis le code que tu as tenté et explique les soucis que tu rencontres.

Cordialement,

Kohntark -