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 :

lire une cellule de fichier CSV avec fgetcsv si la cellule du CSV est écrite sur plusieurs lignes


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut lire une cellule de fichier CSV avec fgetcsv si la cellule du CSV est écrite sur plusieurs lignes
    Bonsoir,

    j'ai un code pour lire des fichiers CSV qui fonctionne bien si les cellules sont écrites sur une seule ligne mais qui échoue si elles sont écrites sur plusieurs lignes. Peut-on me dire ce qu'il faudrait faire ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $enclosure   = empty(self::$enclosure) ? chr(8) : self::$enclosure;
     while (($row = fgetcsv(self::$handle, $buffer, self::$separator, $enclosure)) !== false) {
          $key = self::$header;
          $value = $row;
     
          self::$data[] = array_combine($key, $value);
    }
    La ligne qui définit $enclosure n'est pas de moi mais je vois que $enclosure vaut \b.

    Si une cellule du fichier CSV est écrite sur plusieurs lignes, j'ai ce message d'erreur :
    Fatal error: Uncaught ValueError: array_combine(): Argument #1 ($keys) and argument #2 ($values) must have the same number of elements in C:\projets\ticket_rawsrc\model\CSVParser.php:119 Stack trace: #0 C:\projets\ticket_rawsrc\model\CSVParser.php(119): array_combine(Array, Array) #1 C:\projets\ticket_rawsrc\model\CSVImport.php(38): ticket_rawsrc\model\CSVParser::parse('C:\\projets\\tick...', 4096) #2 C:\projets\ticket_rawsrc\controller\CSVImportController.php(72): ticket_rawsrc\model\CSVImport::uploadFile('C:\\projets\\tick...') #3 C:\projets\ticket_rawsrc\index.php(112): ticket_rawsrc\controller\CSVImportController->invoke(Array) #4 {main} thrown in C:\projets\ticket_rawsrc\model\CSVParser.php on line 119
    et il semblerait que ça vient du fait que seule la première ligne de la cellule du fichier CSV est prise en compte (c'est ma déduction, mais n'en suis pas sûr)

    Si je fais du debug :
    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
    $enclosure   = empty(self::$enclosure) ? chr(8) : self::$enclosure;
    while (($row = fgetcsv(self::$handle, $buffer, self::$separator, $enclosure)) !== false) {
          $key = self::$header;
          $value = $row;
          UtilFct::debug("csvparser 99 row ",$row);
          //deb debug
          echo '<br/><br/>key count : ', count($key).'<br/>';
          echo 'value count : ', count($value)."<br/><br/>";
          $i=0;
          foreach($key as $one_key)
          {
              echo "key(".$i++.")";
              var_export($one_key);
               echo '<br/>';
          }
          $i=0;
     
          foreach($value as $one_value)
          {
                echo "value(".$i++.")";
                var_export($one_value);
                echo '<br/>';
           }
           echo "<br/><br/>";
           //end debug
           self::$data[] = array_combine($key, $value);
    }
    ça donne :
    csvparser 99 row
    array(5) {
    [0]=>
    string(7) "sept-21"
    [1]=>
    string(3) "MEA"
    [2]=>
    string(2) "No"
    [3]=>
    string(3) "Web"
    [4]=>
    string(24) ""ISSUE: Opus - OE Tools\"
    }



    key count : 6
    value count : 5

    key(0)'mois de months'
    key(1)'regions (1)'
    key(2)'reopened'
    key(3)'reported source'
    key(4)'resolution'
    key(5)'resolution ola status'
    value(0)'sept-21'
    value(1)'MEA'
    value(2)'No'
    value(3)'Web'
    value(4)'"ISSUE: Opus - OE Tools\\'
    alors que la cellule sur plusieurs lignes contient :
    ISSUE: Opus - OE Tools
    CAUSE: I cannot install new OPUS Tool  issue is I do not have Administrator 
    RESOLUTION: 
    DID USER CONFIRMED ISSUE RESOLVED: Yes
    To obtain more detailed information about this ticket, you just have to go to the 2929IT Portal Ho

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 358
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 358
    Billets dans le blog
    17
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $enclosure   = empty(self::$enclosure) ? chr(8) : self::$enclosure;
    chr(8) est le backspace, bizarre de l'utiliser en tant que délimiteur
    Pour du CSV $enclosure devrait plutôt valoir " par défaut

    fgetcsv() supporte bien les champs multi-lignes. Il faut par contre que ces champs soient correctement délimités par $enclosure.

    Ton CSV est-il valide en ce sens ?

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse. J'étais pas dispo pour répondre plus tôt

    Je viens d'essayer : $enclosure = empty(self::$enclosure) ? chr(22) : self::$enclosure;.

    Mon CSV :
    Mois de Months;Regions (1);Reopened;Reported Source;Resolution;Resolution OLA Status
    sept-21;MEA;No;Phone;Please retrigger the profile.;Missed
    sept-21;MEA;No;Web;"ISSUE: Opus - OE Tools
    CAUSE: I cannot install new OPUS Tool  issue is I do not have Administrator 
    RESOLUTION: 
    DID USER CONFIRMED ISSUE RESOLVED: Yes
    To obtain more detailed information about this ticket, you just have to go to the 2929IT Portal Ho";Missed
    
    Même message d'erreur...

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 358
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 358
    Billets dans le blog
    17
    Par défaut
    Pourquoi utiliser chr() pour exprimer un littéral imprimable ? chr() rend le script difficile à lire et bugogène => 22 n'est pas 0x22 Met directement ton délimiteur

    Et puis changer la valeur par défaut ne change pas l'éventuel mauvais self::$enclosure

  5. #5
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 495
    Billets dans le blog
    1
    Par défaut
    Cette fois, je répond un peu plus vite
    Si j'ai mis chr(22), c'est que j'avais d'abord essayé $enclosure = empty(self::$enclosure) ? " : self::$enclosure; mais que comme un peu plus loin, j'initialise des chaînes de caractères (donc avec des "), il est perdu. Comment faut faire ?

    Citation Envoyé par Séb. Voir le message
    Et puis changer la valeur par défaut ne change pas l'éventuel mauvais self::$enclosure
    C'est le seul endroit où on initialise cette propriété donc self::$enclosure a peu de risque d'être mauvais, non ?

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 358
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 358
    Billets dans le blog
    17
    Par défaut
    Si j'ai mis chr(22), c'est que j'avais d'abord essayé $enclosure = empty(self::$enclosure) ? " : self::$enclosure; mais que comme un peu plus loin, j'initialise des chaînes de caractères (donc avec des "), il est perdu
    Je ne comprends pas, et ta syntaxe n'est pas valide.

    C'est le seul endroit où on initialise cette propriété donc self::$enclosure a peu de risque d'être mauvais, non ?
    Je ne vois pas d'initialisation de self::$enclosure dans ton script.

    Tu ne montres pas comment tu utilises ton code, et je répète chr(8) et chr(22) ne représentent pas un " => Mets un " directement

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

Discussions similaires

  1. Lire une liste de fichier mp3 avec un raspberry
    Par frederic13870 dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 20/06/2019, 13h46
  2. Impossible de lire une cellule dans un fichier fermé
    Par Mic13710 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 09/06/2015, 23h57
  3. [Débutant] Lire une cellule dans un fichier excel
    Par Annihil dans le forum C#
    Réponses: 1
    Dernier message: 15/11/2011, 08h32
  4. Lire une cellule dans un autre fichier
    Par jurgh dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/09/2009, 18h22
  5. lire une cellule dans une DBGrid
    Par flo74 dans le forum Bases de données
    Réponses: 10
    Dernier message: 30/01/2006, 09h52

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