IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Importation depuis csv, ajout d'une colonne et remplissage de la colonne


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Par défaut Importation depuis csv, ajout d'une colonne et remplissage de la colonne
    Bonjour, je viens içi car j'ai un problème avec mon code. Voilà, je souhaite chargé un fichier csv dans ma base de données wamp. Ensuite, je dois ajouter une colonne à la fin de cette table puis, la remplir depuis une autre table.
    Dans test_table, j'ai plusieurs champs tel que le nom de la personne, celle de son époux, la date de mariage. Un seul des 2 noms peut être rempli ou les 2. Je possède une table avec le nom de toutes les personnes et la zone géographique de leur habitation. Je souhaite faire grâce à mes requêtes remplir le champs zone de ma test_table par celui qui correspond à la personne depuis la 2nde table.

    Voilà le code que j'ai implémenter mais il est très très lourd et ne fait pas le tour de toute ma base de données pour l'implémentation de la zone sachant que j'ai pour le moment environ 7000 lignes. Quelqu'un aurait-il une solution plus légère ou une qui fasse au moins toute les lignes?
    De plus, je souhaite éxécuté ce code à un intervalle de temps prévu. On m'a parlé de CronTab et At mais je ne comprends pas comment m'en servir. Quelqu'un pourrait-il aussi m'aiguiller pour cela

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    // connexion à la BDD
    	$serveur = "localhost";
    	$login = "root";
    	$mdp = "";
    	$datebank = "orfea";
    	$bdd = mysql_connect($serveur, $login, $mdp) or die("Erreur de connexion à la BDD");
    	mysql_select_db($datebank) or die ("No database found !");
    	set_time_limit(0);
    	$sq = "DELETE FROM test_table";
    	//Vide la table test2 pour éviter les doublons
    	mysql_query($sq);
    	$suppzone = "ALTER TABLE test_table DROP COLUMN zone";
    	mysql_query($suppzone);
    	$insert = "LOAD DATA LOCAL INFILE 'D:/wamp/www/Orfea/Excel/test_table.csv' INTO TABLE test_table FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES";
    	$db = mysql_query($insert) or die (mysql_error());
    	$addc = "ALTER TABLE test_table ADD zone VARCHAR(255)";
    	$db1 = mysql_query($addc) or die (mysql_error());
    	$db2 = mysql_query('SELECT Nom_princ, Nom_epoux
    						FROM tact_table
    						') or die (mysql_error());
    	while($donnees = mysql_fetch_assoc($db2)) 
    	{
    		if($donnees['Nom_princ'] !== ' ')
    		{
    			$nom = $donnees['Nom_princ'];
    			$query = "UPDATE test_table, charge
    					  SET test_table.zone = charge.Zone
    					  WHERE test_table.Nom_princ = charge.Nom
    					  AND test_table.Nom_princ = '$nom'";
    			$remplzone = mysql_query($query) or die (mysql_error());
    		}
    		else
    		{
    			$nom = $donnees['Nom_epoux'];
    			$query = "UPDATE test_table, charge
    					  SET test_table.zone = charge.Zone
    					  WHERE test_table.Nom_epoux = charge.Nom
    					  AND test_table.Nom_epoux = '$nom'";
    			$remplzone = mysql_query($query) or die (mysql_error());
    		}
    	}

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Par défaut
    Bonjour,

    tu peux tout faire en utilisant uniquement de SQL :

    supposons que ta table contient 12 colonnes et que la cinquième colonne correspond à la zone.

    maintenant si ton fichier csv contient lui aussi le même colonnage, sauf que tu ne veut pas importer la colonne zone mais plutôt la mettre à jour depuis une autre table (charge)

    tu dois d'abord créer un fonction sql sur ton phpmyadmin qui renvoi la valeur de la zone pour une valeur bien déterminée disons find_zone().

    puis dans ton load data infile tu precise le colonnage comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $insert = "LOAD DATA LOCAL INFILE 'D:/wamp/www/Orfea/Excel/test_table.csv' INTO TABLE test_table FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES (@col1,col2,col3,col4,@zone,col6,...) SET 
    col1=@col1,
    zone=find_zone(@col1)";
    et ça t'évite d'importer puis de mettre à jour en parcourant record par record.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 24
    Par défaut
    Citation Envoyé par mandrake_of_mandregas Voir le message
    tu dois d'abord créer un fonction sql sur ton phpmyadmin qui renvoi la valeur de la zone pour une valeur bien déterminée disons find_zone().

    puis dans ton load data infile tu precise le colonnage comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $insert = "LOAD DATA LOCAL INFILE 'D:/wamp/www/Orfea/Excel/test_table.csv' INTO TABLE test_table FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES (@col1,col2,col3,col4,@zone,col6,...) SET 
    col1=@col1,
    zone=find_zone(@col1)";

    si possible un lien pour comprendre un peut mieux ceci, merci

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Par défaut
    ça ça devrait être ta fonction sql à mettre sur phpmyadmin à toi de mijoter :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DROP FUNCTION IF EXISTS find_zone;
    DELIMITER $$
    FUNCTION find_zone(nom VARCHAR(255)) RETURNS VARCHAR(255)
    BEGIN
    DECLARE lazone VARCHAR(255);
    IF ISNULL(nom) THEN RETURN NULL; END IF;
    SELECT  charge.Zone INTO lazone FROM charge WHERE  charge.Nom=nom;
    RETURN lazone ;
    $$
    DELIMITER ;

    puis au niveau de ton php tu mets le code comme je l'ai indiqué.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 181
    Par défaut
    Bonjour, tout d'abord merci de l'intérêt que vous portez à mon code.
    @Mandrake : je ne comprends pas vraiment ton code. Premièrement pourquoi utilises tu un SET alors qu'avec le LOAD DATA, si les colonnes sont déjà existante, les valeurs s'inscrivent directement dans l'ordre les une à la suite des autres.
    En ce qui concerne ta fonction find_zone. Je comprends ton idée mais je ne vois pas comment inclure un fichier sql dans phpmyadmin. Je n'ai jamais utilisé une fonction en sql mais je suppose que la fonction que tu m'as passé ne doit pas être exactement ce que je cherche. Si c'est le cas peux-tu m'expliqur la démarche de ta fonction s'il te plait ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Par défaut
    je veis te répondre en mode algo :

    je veux importer un fichier csv à 5 colonne dans une table alpha à 5 colonnes sauf que pour la col5 je ne vais pas importer la donnée du fichier csv.
    Je veux plutôt pour chaque ligne importée chercher la valeur correspondante de la col1 dans mon fichier dans la table des zones et renvoyer la zone dans col5.

    ce que tu fais toi c'est importer la totalité du fichier puis tu supprime la col5 importée. puis tu fais un update de la col5 par la zone depuis la table zone selon la correspondance de col1

    mysql te permet d'importer des fichier csv de définir le colonnage et également d'importer vers des variables, ces variable calculés peut être attribués à des colonnes de destinations.

    La fonction find_zone accomplie la tache de trouver la zone depuis la table zone pour chaque nom importé depuis le csv

    le SET de LOAd data infile permet d'affecter le résultat de la fonction à ta colonne de destination.

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 50
    Par défaut
    Bonjour,

    Je n'ai pas trop d'avis sur la partie SQL mis à part que supprimer une colonne pour l'ajouter ensuite ce n'est pas très beau et pas bon pour les performances.

    Pour l'exécution du code à intervalle régulier, comme tu as l'air de tourner sous Windows vu que tu utilises WAMP, tu peux plannifier une tâche qui ouvrira ton naviguateur sur ta page PHP dans Accessoires -> Outils Système -> Plannificateurs de tâches

    @+
    Nico

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2013
    Messages : 24
    Par défaut
    voici peut-être une solution :

    elle n’allège pas la requête mais aux moins elle vous montre la progression de votre requête

    sont principe c'est quelle ne lit pas la table entièrement mais 100 ligne a la fois, et apres la fin du traitement de ces 100 ligne, la page se recharge elle même pour traiter les 100 ligne suivant(Javascript), alors je ne sait pas si ça vous arrange ou pas.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    	// connexion à la BDD
    	$serveur = "localhost";
    	$login = "root";
    	$mdp = "";
    	$datebank = "orfea";
    	$bdd = mysql_connect($serveur, $login, $mdp) or die("Erreur de connexion à la BDD");
    	mysql_select_db($datebank) or die ("No database found !");
    	set_time_limit(0);
     
    	if((!empty($_GET['id1'])) AND (!empty($_GET['id2']))){
    		$i1 = $_GET['id1'];
    		$i2 = $_GET['id2'];
    	}
    	else{
    		$sq = "DELETE FROM test_table";
    		//Vide la table test2 pour éviter les doublons
    		mysql_query($sq);
    		$suppzone = "ALTER TABLE test_table DROP COLUMN zone";
    		mysql_query($suppzone);
    		$insert = "LOAD DATA LOCAL INFILE 'D:/wamp/www/Orfea/Excel/test_table.csv' INTO TABLE test_table FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '\"' IGNORE 1 LINES";
    		$db = mysql_query($insert) or die (mysql_error());
    		$addc = "ALTER TABLE test_table ADD zone VARCHAR(255)";
    		$db1 = mysql_query($addc) or die (mysql_error());
     
    		$i1 = 0;
    		// je ne c'est pas si c'est bien sette table qui contin le nembre de ligne
    		$sql = mysql_query("SELECT COUNT(1) AS cont
    							FROM `tact_table` ")
    				or die (mysql_error());
    		while( $res = mysql_fetch_assoc($sql)){
    			$i2 = $res['cont'];
    		}
    	}
    	$i3 = 200;
    	$recharg = true;
    	if ($i1+$i3 > $i2){
    		$i3 = $i2 - $i1;
    		$recharg = false;
    	}
     
    	$db2 = 	mysql_query("	SELECT Nom_princ, Nom_epoux
    							FROM tact_table
    							LIMIT $i1 , $i3	")
    			or die (mysql_error());
     
    	while($donnees = mysql_fetch_assoc($db2)) 
    	{
    		if($donnees['Nom_princ'] !== ' ')
    		{
    			$nom = $donnees['Nom_princ'];
    			$query = "UPDATE test_table, charge
    					  SET test_table.zone = charge.Zone
    					  WHERE test_table.Nom_princ = charge.Nom
    					  AND test_table.Nom_princ = '$nom'";
    			$remplzone = mysql_query($query) or die (mysql_error());
    		}
    		else
    		{
    			$nom = $donnees['Nom_epoux'];
    			$query = "UPDATE test_table, charge
    					  SET test_table.zone = charge.Zone
    					  WHERE test_table.Nom_epoux = charge.Nom
    					  AND test_table.Nom_epoux = '$nom'";
    			$remplzone = mysql_query($query) or die (mysql_error());
    		}
    	}
     
    	$i1 += $i3;
     
            // l'affichage de la progression de la requête :
    	echo "$i1 operation reussite<br/>";
     
    	if($recharg){ // Le Javascript pour l'actualisation de la page:
    		echo "	<script type='text/Javascript'>
    					location.href ='?id1=$i1&id2=$i2';
    				</script>";
    	}
    je suit débutant avec le PHP alors n'esitez pas a me corriger s'ile vous plais
    merci

Discussions similaires

  1. [AC-2010] Import depuis excel Erreur 462 une fois sur 2
    Par prendel dans le forum Access
    Réponses: 2
    Dernier message: 28/07/2014, 14h13
  2. Importer un CSV distant dans une Feuille
    Par Ceubex dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 27/06/2014, 11h31
  3. [1.x] Ajout d'une action Import CSV dans l'admin generator
    Par Nico_F dans le forum Symfony
    Réponses: 1
    Dernier message: 02/05/2011, 15h14
  4. Réponses: 9
    Dernier message: 08/11/2010, 22h35
  5. [XL-2007] importer un csv texte dont une cellule peut contenir plusieurs lignes
    Par fourchette dans le forum Excel
    Réponses: 1
    Dernier message: 16/07/2010, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo