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

Langage PHP Discussion :

Editer un fichier CSV


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut Editer un fichier CSV
    Bonjour,

    Voilà il est possible de lire un fichier csv notamment grâce à la fonction fgetcsv()
    http://php.net/manual/fr/function.fgetcsv.php

    Il est aussi possible d'ajouter des données à la fin d'un fichier csv grâce notament à cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $list = array (
       array('aaa', 'bbb', 'ccc', 'ddd'),
       array('eee', 'fff', 'ggg', 'hhh'));
     
    $fp = fopen('file.csv', 'a');
     
    foreach ($list as $fields) {
        fputcsv($fp, $fields, ';');
    }
    fclose($fp);
    ?>
    Mais est-il possible de supprimer une ligne complète contenue dans un fichier ?
    Comment procéderiez vous ?

    Par exemple je souhaiterais supprimer la ligne complète qui contient la chaîne ggg.

    D'avance merci.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ton open est faux, le ";" c'est à mettre dans fputcsv
    si tu veux modifier ton fichier il faut le recréer

  3. #3
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Bonjour,
    Oui exact, erreur de saisie dans mon exemple. J'ai édité.

    Il faut donc que je stock l'ensemble de mon csv dans un tableau.
    Ensuite je supprime la ligne qui contient l'éléments que je souhaite supprimer.
    Enfin je traite mon tableau pour le restocker dans un csv ?

    C'est cela ?

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 386
    Points
    9 386
    Par défaut
    Oui c'est le principe, écraser la totalité du contenu du fichier avec le nouveau contenu. C'est encore ce qui se fait de plus simple.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Re,

    J'ai besoin de votre aide pour mettre en place ma logique.
    Admettons que mon csv source soit de cette forme :
    test.csv
    aaa;bbb;ccc;ddd
    eee;fff;ggg;hhh
    iii;jjj;kkk;lll
    mmm;nnn;ooo;ppp
    J'aimerais arriver à ce résultat.
    test.csv
    aaa;bbb;ccc;ddd
    iii;jjj;kkk;lll
    mmm;nnn;ooo;ppp
    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
    <?php 
    	$tab = array_map('trim', file('test.csv'));
    	fclose($fichier); 
     
    	$key = array_search('eee', $tab); 
    	unset($tab[$key]);
     
    	$newFich = fopen('test.csv','w');
    	if($newFich){ 	
    		foreach ($data as $ligne) {
    			fputcsv($newFich, $ligne);
    		}
    		fclose($f);
    	}
    ?>
    Le problème c'est qu'actuellement mon code ne fonctionne pas.
    A priori array_search ne me retourne rien.
    Ai-je loupé un épisode ?

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Déjà tu n'a pas besoin d'utiliser fopen si tu utilises file. Regarde la doc et les options de cette fonction http://php.net/manual/fr/function.file.php
    Ensuite chaque valeur de ton tableau sera constitué d'une ligne complète et donc 'eee' != 'eee;fff;ggg;hhh'

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    aucun intérêt de faire 2 fopen et 1 file

  8. #8
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par ABCIWEB Voir le message
    Déjà tu n'a pas besoin d'utiliser fopen si tu utilises file. Regarde la doc et les options de cette fonction http://php.net/manual/fr/function.file.php
    Ensuite chaque valeur de ton tableau sera constitué d'une ligne complète et donc 'eee' != 'eee;fff;ggg;hhh'
    Ok merci.

    Mais ya t'il une possibilité de trouver la ligne qui contient l'élément eee ?
    Sachant qu'a chaque fois l'élément recherché se situe toujours à la meme position.

    Exemple ici je recherche soit aaa, eee, iii ou mmm.

  9. #9
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Voila j'ai un peu avancé.
    Qu'en pensez-vous ?
    Que me conseillez vous pour la réécriture du tableau dans le csv ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $res = file("test.csv", FILE_IGNORE_NEW_LINES);
    if ($res != FALSE) {
      $elemSearch = "eee";
      foreach ($res as $key => $line) {
       if (preg_match('/'.$elemSearch.'/i', $line))
        unset($res[$key]);
      }
    }
    ?>

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    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
    <?php
    // Création du fichier avec 4 lignes pour test;	
    $tab = array();
    $tab[] = 'aaa;bbb;ccc;ddd';
    $tab[] = 'eee;fff;ggg;hhh';
    $tab[] = 'iii;jjj;kkk;lll';
    $tab[] = 'mmm;nnn;ooo;ppp';
     
    if(($fp = fopen('test.csv', "w")) !== FALSE)
    {
    	foreach ($tab as $ligne) 
    	{
    		fputcsv($fp, explode(";",$ligne),';');	
    	}
    	fclose($fp);
    }
     
     
     
     
    // premier champ de la ligne à effacer
    $efface_ligne = 'iii';
     
     
    if (($handle = fopen("test.csv", "r+")) !== FALSE) 
    {
    	$resultat = array();
     
    	// Lit le fichier csv
            while (($data = fgetcsv($handle, 0, ";")) !== FALSE) 
    	{
    		//data[0] = premier champ de chaque ligne
            if($data[0] != $efface_ligne)
    		{
    			$resultat[] = $data;
    		}
            }
     
    	// efface le contenu du fichier
    	ftruncate($handle, 0);
     
    	// Ecrit le tableau résultant en csv dans le fichier
    	foreach($resultat as $value)
    	{
    		fputcsv($handle, $value,';');
    	}
     
        fclose($handle);
    }
     
    // Juste pour contrôle
    $tab_csv = file('test.csv');
    echo '<pre>';
    print_r($tab_csv);
    echo '</pre>';
     
    ?>

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par gege765 Voir le message
    Voila j'ai un peu avancé.
    Qu'en pensez-vous ?
    Que me conseillez vous pour la réécriture du tableau dans le csv ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $res = file("test.csv", FILE_IGNORE_NEW_LINES);
    if ($res != FALSE) {
      $elemSearch = "eee";
      foreach ($res as $key => $line) {
       if (preg_match('/'.$elemSearch.'/i', $line))
        unset($res[$key]);
      }
    }
    ?>
    C'est un bon début mais avec cette méthode tu va être obligé d'ouvrir deux fois le fichier : 1 fois avec file et la seconde fois avec fopen pour écrire ton fichier csv.
    Par ailleurs ton code ne permet pas de tester la position de "$elemSearch" dans ta ligne.

    Le code que je viens de te montrer plus haut n'ouvre qu'une fois le fichier et permet de rechercher ta chaine de caractère dans un champ précis de ta ligne. Si pas de position précise à déterminer et pour tester tous les champs il suffirait d'écrire dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!in_array ($efface_ligne, $data)) 
    {
    $resultat[] = $data;
    }
    à la place de
    //data[0] = premier champ de chaque ligne
    if($data[0] != $efface_ligne)
    {
    $resultat[] = $data;
    }

  12. #12
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Merci de ton aide et de tes conseils.

    Par contre après test, dans mon fichier résultat j'ai ceci en début de fichier sous notepad++:
    nullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullaaa;bbb;ccc;ddd
    eee;fff;ggg;hhh
    mmm;nnn;ooo;ppp
    Ou des espaces vides sous bloc-note
    aaa;bbb;ccc;ddd
    eee;fff;ggg;hhh
    mmm;nnn;ooo;ppp
    Ya t'il un bug avec ftruncate ?

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    C'est sans doute fgetcsv qui renvoi null sur des lignes vides.

    Je t'ai donné le principe de base, maintenant tu peux l'améliorer. Tu peux filtrer les tableaux qui n'ont qu'un élement et qui est égal à null

    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
    // champ de la ligne à effacer
    $efface_ligne = 'jjj';
     
    // position du champ à tester (commence à 0)
    $position = 1;//deuxième champ
     
    if (($handle = fopen("test.csv", "r+")) !== FALSE) 
    {
    	$resultat = array();
     
    	// Lit le fichier csv
        while (($data = fgetcsv($handle, 0, ";")) !== FALSE) 
    	{
            if(!(count($data)==1 && $data[0] === null) && !(isset($data[$position]) && $data[$position] == $efface_ligne))
    		{
    			$resultat[] = $data;
    		}
        }
     
    	// efface le contenu du fichier
    	ftruncate($handle, 0);
     
    	// Ecrit le tableau résultant en csv dans le fichier
    	foreach($resultat as $value)
    	{
    		fputcsv($handle, $value,';');
    	}
     
        fclose($handle);
    }

  14. #14
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Excuse moi mais à mon niveau j'ai du mal à tous comprendre.

    En tout cas merci pour ton aide.

  15. #15
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Pour information, la dernière version du code ne résout pas le problème et comme je perds le fil il me parait plus simple de ré-ouvrir une deuxième fois le fichier.

  16. #16
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Je viens de rééditer mon précédent message qui comportait une erreur.

    Comme je le disais "fgetcsv" renvoie un tableau avec la valeur null s'il trouve une ligne vide. On peut donc écarter les tableaux qui n'ont qu'un élément avec la valeur nulle en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!(count($data)==1 && $data[0] === null))
    La suite de la condition c'est pour pouvoir choisir quel champ est à tester dans la ligne à effacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!(isset($data[$position]) && $data[$position] == $efface_ligne))
    mais si tu veux tester ton expression dans tous les champs de ta ligne il faudrait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!(in_array($efface_ligne,$data))
    donc au total la condition pour remplir le tableau $résultat serait soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!(count($data)==1 && $data[0] === null) && !(isset($data[$position]) && $data[$position] == $efface_ligne))
    {
    $resultat[] = $data;
    }
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(!(count($data)==1 && $data[0] === null) && !(in_array($efface_ligne,$data))
    {
    $resultat[] = $data;
    }

  17. #17
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Merci encore de tes explications détaillées.

    Cependant même avec cette "nouvelle version de code", le null est toujours présent en début de fichier.

    C'est à se demander si la source du problème est bien fgetcsv.

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    oui... tu peux me montrer ton fichier de test "test.csv" avant modification ?

  19. #19
    Membre régulier
    Inscrit en
    Avril 2009
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 177
    Points : 78
    Points
    78
    Par défaut
    Le voici en pièce jointe renommer en .txt pour que je puisse le joindre.
    Le fichier à un encodage par défaut (ANSI)
    Pour info je suis sous Windows, et travail avec Wampserver.

    Mon fichier contient :
    aaa;bbb;ccc;ddd
    eee;fff;ggg;hhh
    iii;jjj;kkk;lll
    mmm;nnn;ooo;ppp
    Fichiers attachés Fichiers attachés

  20. #20
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Bon, j'avais oublié de remettre le pointeur à zero, cela devrait mieux fonctionner comme cela avec un rewind après le ftruncate :
    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
    <?php
     
    // Création du fichier de test avec 4 lignes;	
    $tab = array();
    $tab[] = "aaa;bbb;ccc;ddd";
    $tab[] = "eee;fff;ggg;hhh";
    $tab[] = "iii;jjj;kkk;lll";
    $tab[] = "mmm;nnn;ooo;ppp";
     
    if(($fp = fopen('test.csv', "w")) !== FALSE)
    {
    	foreach ($tab as $ligne) 
    	{
    		fputcsv($fp, explode(";",$ligne),';');	
    	}
    	fclose($fp);
    }
     
     
     
     
    // texte du champ de la ligne à effacer
    $efface_ligne = 'eee';
     
    // position du champ à tester (commence à 0)
    $position = 0;//0=premier champ
     
    if (($handle = fopen("test.csv", "r+")) !== FALSE) 
    {
    	$resultat = array();
     
    	// Lit le fichier csv
            while (($data = fgetcsv($handle, 0, ";")) !== FALSE) 
    	{
            if(!(count($data)==1 && $data[0] === null) && !(isset($data[$position]) && $data[$position] == $efface_ligne))
    		{
    			$resultat[] = $data;
    		}
             }
     
    	ftruncate($handle, 0);
    	rewind($handle);
     
     
    	// Ecrit le tableau résultant en csv dans le fichier
    	foreach($resultat as $value)
    	{
    		fputcsv($handle, $value, ";");
    	}
     
    	fclose($handle);
    }
    ?>
    Chez moi on peut directement ouvrir le fichier généré avec excel donc ça devrait le faire

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Tableur simple pour editer des fichiers csv
    Par jimou81 dans le forum Excel
    Réponses: 1
    Dernier message: 06/03/2013, 07h52
  2. Edition de fichier CSV
    Par Tibo dans le forum Langage
    Réponses: 2
    Dernier message: 19/11/2009, 14h11
  3. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  4. Réponses: 2
    Dernier message: 14/05/2004, 12h55

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