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 :

[CSV] Fonction fgetcsv() pour multiligne dans une cellule du fichier CSV


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 65
    Points : 55
    Points
    55
    Par défaut [CSV] Fonction fgetcsv() pour multiligne dans une cellule du fichier CSV
    Bonjour,

    Je voudrais savoir si c'est possible de utiliser fgetcsv() pour récupérer un champ qui a plusieurs lignes dans sa cellule (cequi on a fait ""Alt+Entrée"" avec).
    Par exemple:

    ----------
    id |champ|
    ----------
    ....| a |
    1 .| b |
    ....| c |
    ----------
    2 | f |
    ----------

    avec fgetcsv($handle, 10000, "\r\n"), cela retourne:

    1ère ligne:1;a;
    2ère ligne:b;
    3ère ligne:c;
    4ère ligne:2;f


    Mais en effet a,b,c doivent être dans la même ligne!

    Quelqu'un peut m'aider? Merci beaucoup!!!

    Bonne journée

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Bonjour,

    A mon avis le problème vient du choix du séparateur.
    Ici, tu déclares comme séparateur le retour à la ligne (\r\n).
    Or tu désires récupérer dans un premier temps les champs séparés par un ;, puis ceux à la ligne.
    Si j'ai bien compris le problème, je te conseille donc de passer par un traitement manuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while(fgetcsv($handle, 10000, ";")) {
       $tampon = split(chr(13).chr(10), $handle[0]);
    }

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 65
    Points : 55
    Points
    55
    Par défaut Re-expliquer
    Bonjour,

    Je pense que j'ai pas bien expliqué mon problème. En effet, je veux mettre à jour ma base Mysql avec un fichier CSV (qui vient d'un fichier excel).
    Avant de faire les UPDATE, je fais les codes PHP afin d'afficher la contenue du fichier CSV sur l'écan.

    Parce que un fichier Csv est un fichier qui sépare les champs de la même ligne par ";" et termine la ligne par "," . Nous pouvons utiliser le code
    fgetcsv($handle, 10000, ",")
    pour récupérer toute les lignes des données du fichier.

    Mais il y a quelques champs de commentaire qui contient lui-même ",", cela perturbe le code, donc je l'ai changé à
    fgetcsv($handle, 10000, "\r\n")
    et cela marche nickel!

    Néanmoins s'il exist un champs qui contient plusieurs lignes dans sa cellule (la cellule garde le format qui vient de Excel), il peut perturber également ce 2ème code, car ce champ peut-être virtuellement contenir plusieurs "\r\n" lui-même.

    J'ai besoin donc de solution pour résoudre cela.

    Merci beaucoup à vos aides !!! Aidez-moi !!!!!

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Normalement la fonction fgetcsv gère bien les délimiteurs à l'intérieur d'une cellule, puisque le contenu de celle-ci est encadré de guillemets.
    Es tu sûr que ton fichier csv est dans un format correct ?

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par ratapapa Voir le message
    Normalement la fonction fgetcsv gère bien les délimiteurs à l'intérieur d'une cellule, puisque le contenu de celle-ci est encadré de guillemets.
    Es tu sûr que ton fichier csv est dans un format correct ?
    Je donne mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    $row = 1;
    $handle = fopen("toto.csv", "r");
     
    while (($data = fgetcsv($handle, 10000, "\r\n")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
    ?>
    avec le tableau dans l'exemple, j'ai cela comme résultat:

    1 fields in line 1:

    Id ;value

    1 fields in line 2:

    1;"a

    1 fields in line 3:

    b

    1 fields in line 4:

    c"

    1 fields in line 5:

    2;d


    Les contenues sont bien entre guillemets, mais pas dans la bonne ligne...
    Comment faire alors...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    572
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Juin 2005
    Messages : 572
    Points : 716
    Points
    716
    Par défaut
    Je persiste et je signe d'après les résultats ton délimiteur est bien un point virgule, et non un retour chariot.

    Pourrais-tu tenter en remplaçant fgetcsv($handle, 10000, "\r\n") par fgetcsv($handle, 10000, ";") ?

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 65
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par ratapapa Voir le message
    Je persiste et je signe d'après les résultats ton délimiteur est bien un point virgule, et non un retour chariot.

    Pourrais-tu tenter en remplaçant fgetcsv($handle, 10000, "\r\n") par fgetcsv($handle, 10000, ";") ?
    Bonjour,
    Oui, tu as raison, j'ai les résultats comme cela mtn, merci bien Ratapapa
    2 fields in line 1:

    Id
    value

    2 fields in line 2:

    1
    a b c

    2 fields in line 3:

    2
    d

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 20/01/2014, 22h04
  2. [C#][Excel] Problème pour écrire dans une cellule
    Par MoscoBlade dans le forum C#
    Réponses: 1
    Dernier message: 24/02/2010, 16h54
  3. [MySQL] fonction implode pour écrire dans une BD
    Par tinkerbell dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 05/05/2009, 18h17
  4. Réponses: 2
    Dernier message: 15/09/2008, 11h42
  5. [XSLT][>CSV]retour a la ligne dans une cellule d'un fichier csv
    Par ujoodha dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 09/07/2006, 12h08

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