Envoyer un fichier CSV dans une base

Schlaf Messages postés 12 Date d'inscription lundi 10 janvier 2011 Statut Membre Dernière intervention 10 janvier 2011 - 28 janv. 2010 à 09:10
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 - 28 janv. 2010 à 20:07
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

kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
28 janv. 2010 à 10:22
Salut,

Regarde du côté de LOAD DATA INFILE

Cordialement,



Kohntark -
0
Schlaf Messages postés 12 Date d'inscription lundi 10 janvier 2011 Statut Membre Dernière intervention 10 janvier 2011
28 janv. 2010 à 13:00
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
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
28 janv. 2010 à 20:07
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 -
0