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 :

déterminer séparateur et enclosure d'un fichier CSV


Sujet :

Langage PHP

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut déterminer séparateur et enclosure d'un fichier CSV
    Bonjour,

    jusqu'à présent, j'utilisais sans souci un code pour déterminer séparateur et enclosure d'un fichier CSV. Cependant, cherchant à mettre au point une nouvelle fonctionnalité, j'utilise de nouveau ce code et pour un CSV dont le caractère d'enclosure est ", il me trouve qu'il n'y en a pas. D'où ça vient SVP ?

    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
    42
    43
    44
    45
    46
    47
     if (( ! is_file($filepath)) || (false === (self::$handle = fopen($filepath, 'r')))) {
                throw new Exception("impossible to open the file '$filepath'");
            }
     
    if (isset(self::$handle)) {
                $row = fgets(self::$handle);
                $row=strtolower($row); //mettre header en minuscules
            } // doit contenir les en-têtes des colonnes}
            if (empty($row)) {
                self::$errors[] = 'The file is empty';
                return false;
            }
     
            // séparateur
            if (mb_stripos($row, ',') !== false) {
                self::$separator = ',';
            } elseif (mb_stripos($row, ';') !== false) {
                self::$separator = ';';
            } else {
                self::$errors[] = 'Unable to detect the CSV field separator';
                return false;
            }
     
            $char = mb_substr($row, 0, 1); // premier caractère
            if ($char === '\xef\xbb\xbf') {  //if first character is BOM, one begins with the next character
                $row  = mb_substr($row, 1);
                $char = mb_substr($row, 0, 1);
            }
     
            if (($char === '"') && (mb_stripos($row, '"'.self::$separator.'"') !== false)) {
                self::$enclosure = '"';
            } elseif (($char === "'") && (mb_stripos($row, "'".self::$separator."'") !== false)) {
                self::$enclosure = "'";
            }
     
            if (self::$enclosure) {
                // on vérifie que le premier séparateur trouvé est bien entouré de lettres ASCII
                $i = mb_stripos($row, self::$separator);
                if ($i) {
                    $fc = mb_substr($row, $i - 1, 1);
                    $lc = mb_substr($row, $i + 1, 1);
                    if (ctype_alpha($fc) && ctype_alpha($lc)) {
                        self::$enclosure = '';
                    }
                }
            }
            else  self::$enclosure = '';

    Le fichier 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
    
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  2. #2
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,

    C'est quoi le soucis exactement ? Avec le fichier csv posté et en utilisant

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $handle = fopen('file.csv', 'r');
    $rows = [];
    while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
        $rows[] = $data;
    }
    echo '<pre>';
    print_r($rows);

    j'obtiens

    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
     
    Array
    (
        [0] => Array
            (
                [0] => Mois de Months
                [1] => Regions (1)
                [2] => Reopened
                [3] => Reported Source
                [4] => Resolution
                [5] => Resolution OLA Status
            )
     
        [1] => Array
            (
                [0] => sept-21
                [1] => MEA
                [2] => No
                [3] => Phone
                [4] => Please retrigger the profile.
                [5] => Missed
            )
     
        [2] => Array
            (
                [0] => sept-21
                [1] => MEA
                [2] => No
                [3] => Web
                [4] => 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
                [5] => Missed
            )
     
    )
    n'est-ce pas le résultat attendu ?
    D'où provient le fichier csv que vous manipulez ?
    Le bienfait n'est jamais perdu

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Merci pour la réponse.
    C'est un bon début sauf que vous n'obtenez que la première ligne (le header).

    Mon souci est que $enclosure est mal déterminé.

    J'utilise le résultat en faisant :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $i=0;
    while (($line[] = fgetcsv($file, 4096, $separator, $enclosure)) !== false) {
            $key = $header;
            $value = $line[$i++];
     
            $data[]=array_combine($key, $value);
        }

    Ce CSV est en fait un extract d'une autre bdd.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Y'a un scroll sur le 2ème code . On a bien le header + les données
    Le bienfait n'est jamais perdu

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    mea culpa. Il faudra peut-être que je fasse changer mes lunettes !

    Cependant, vous voyez bien dans l'utilisation que je fais des données, que j'ai besoin d'un $enclosure correct. Or, ce n'est pas le cas...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  6. #6
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Je ne comprends pas réellement le soucis. "$enclosure" correct ça veut dire quoi ? Et c'est quoi comme utilisation ?
    Le bienfait n'est jamais perdu

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Mon utilisation est donnée dans le post #3.

    enclosure est un des paramètres de la fonction fgetcsv : https://www.php.net/manual/fr/function.fgetcsv.php. C'est le paramètre d'encadrement. Dans mon CSV, il vaut " et est utilisé pour la cellule sur plusieurs lignes.
    "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"
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Pour faire simple, de ce csv quel est résultat voulu?
    Je sais ce qu'est un caractère d'encadrement ou "enclosure" si vous voulez.. Mais le rapport avec le résultat voulu, je ne le vois pas
    Le bienfait n'est jamais perdu

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Le but est que le code du post #3 construise le tableau $data ainsi :
    0 : Mois de Months => sept-21 ; Regions (1) => MEA ; Reopened => No ; Reported Source => Phone ; Resolution => Please
    retrigger the profile. ; Resolution OLA Status => Missed

    1 : Mois de Months => sept-21 ; Regions (1) => MEA ; Reopened => No ; Reported Source => Web ; Resolution => 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 ; Resolution OLA Status => Missed
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  10. #10
    Membre éprouvé Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 540
    Points : 1 067
    Points
    1 067
    Par défaut
    Aucun rapport entre le résultat voulu et cette histoire d'enclosure. A partir de mon code, on peut utiliser ça

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $results = [];
    $data = array_slice($rows, 1);
    foreach ($data as $row) {
        $results[] = array_combine($rows[0], $row);
    }
     
    var_dump($results);

    Tout simplement, on a sûrement d'autres manières de faire
    Le bienfait n'est jamais perdu

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Merci beaucoup pour l'aide ; j'ai encore des petits soucis pour utiliser votre code mais je suis un peu fatigué ; ça devrait aller mieux demain matin...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Bonjour Willy_k,

    tous comptes faits, j'ai pas eu le temps ce matin...

    J'ai réussi à utiliser votre code en mode 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
        $handle = fopen(dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'csv'.DIRECTORY_SEPARATOR.'testicket'
                .DIRECTORY_SEPARATOR.'Trends_INC_ sep_debug7.csv', 'r');
            $rows = [];
            while (($data = fgetcsv($handle, 0, ";")) !== FALSE) {
                $rows[] = $data;
            }
     //       echo '<pre>';
    //        print_r($rows);
     
     
            $results = [];
            $data = array_slice($rows, 1);
            foreach ($data as $row) {
                $results[] = array_combine($rows[0], $row);
            }
     
            var_dump($results);
    Mais si je l'intègre dans mon appli, ça marche plus.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     $rows = [];
    while (($theData = fgetcsv(self::$handle, 0, self::$separator)) !== FALSE) {
        $rows[] = $theData;
    }
     
    $myData = array_slice($rows, 1);
    foreach ($myData as $row) {
          self::$data[]  = array_combine($rows[0], $row);
    }

    Quand je dis que ça marche plus, c'est que le tableau self::$data vaut
    0 : sept-21 => sept-21 ; MEA => MEA ; No => No ; Phone => Web ; Please
    retrigger the profile. => SSUE: 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 => Missed
    Je vois pas où est le problème...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    Je n'ai pas cherché à comprendre pourquoi mais j'ai découvert que $rows[0] ne contenait pas le header. La bonne solution est finalement :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $rows = []; //UtilFct::debug("csvparser 98 separator ",self::$separator);
    while (($theData = fgetcsv(self::$handle, 0, self::$separator)) !== FALSE) {
          $rows[] = $theData;
    }
     
    $myData = array_slice($rows, 1);
    foreach ($myData as $row) {
         self::$data[]  = array_combine(self::$header, $row);
    }
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

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

Discussions similaires

  1. [XL-2016] Changer le séparateur de données de son fichier CSV
    Par Muzan93 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/06/2021, 15h04
  2. Problème de séparateur dans fichier CSV
    Par mbibim63 dans le forum Excel
    Réponses: 4
    Dernier message: 05/07/2007, 08h29
  3. Réponses: 12
    Dernier message: 12/04/2006, 10h20
  4. [CSV] Détecter le séparateur pour les fichiers CSV
    Par JavaEli dans le forum Langage
    Réponses: 1
    Dernier message: 30/11/2005, 23h42
  5. [Excel] séparateur pour les fichiers csv
    Par drinkmilk dans le forum Excel
    Réponses: 2
    Dernier message: 27/08/2005, 14h21

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