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 : pas moyen de supprimer """ en fin de ligne et du coup header faux


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 493
    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 493
    Billets dans le blog
    1
    Par défaut CSV : pas moyen de supprimer """ en fin de ligne et du coup header faux
    Bonsoir,
    j'ai un souci pour déterminer le header d'un fichier CSV.

    Début du fichier CSV (édité avec Notepad++) :
    "SESAID,""ALTERNATEIDS"",""PLATFORM"",""PLATFORMOWNER"",""PUBLISHER"",""APPLICATIONNAME"",""HFMCODE"",""CURRENTLYACTIVE"",""ACTIVATEDATE"",""DEACTIVATEDATE"",""GROUPNAME"",""OFFICECOUNTRY"",""FIRSTNAME"",""LASTNAME"",""COMPANYNAME"",
    ""JOBCODE"",""REPORTINGENTITY"",""BUSINESSUNITNAME"",""LOCATION"",""INTERNETADDRESS"",""MANAGERFIRSTNAME"",""MANAGERLASTNAME"",""MANAGEREMAIL""";
    "SESA1000,""(none)"",""Software Engineering"",""SESA84441"",""Atlassian"",""JIRA Global Instance"","""",""True"",""Jan 01, 2021"","""","""",""Spain"",""Miguel"",""Abad"",""SCHNEIDER ELECTRIC ESPANA, S.A.U."",""FKP8"","""",""Global Finance"",""BARCELONA (BAC DE RODA)"",""adresse.mail@se.com"",""Alistair"",""Mckelvie"",""manager.adresse.mail@se.com""";
    traitement pour obtenir le header :
    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
            rewind(self::$handle);//pointer au début du fichier
            if (false !== $line = fgets(self::$handle,4096)) {
     
                $line = preg_replace('~^\N{U+FEFF}~u', '', $line); //retirer le BOM
     
                $char = mb_substr($line, 0, 1); // premier caractère
                if ($char == '"')  {
                    $line = rtrim($line);
                    $line = substr($line,1, -1);
                    $line = str_replace('""', '"', $line);
                    $line = str_replace('"""', '"', $line);
     
                    $separator = ",";
                }
                else
                    $separator = ";";
     
                $enclosure = '"';
     
                $header = str_getcsv($line, $separator, $enclosure);
            }

    Ligne lue avant le traitement (vue en debug pas à pas avec PHPSTORM) :
    "SESAID,""ALTERNATEIDS"",""PLATFORM"",""PLATFORMOWNER"",""PUBLISHER"",""APPLICATIONNAME"",""HFMCODE"",""CURRENTLYACTIVE"",""ACTIVATEDATE"",""DEACTIVATEDATE"",""GROUPNAME"",""OFFICECOUNTRY"",""FIRSTNAME"",""LASTNAME"",""COMPANYNAME"",
    ""JOBCODE"",""REPORTINGENTITY"",""BUSINESSUNITNAME"",""LOCATION"",""INTERNETADDRESS"",""MANAGERFIRSTNAME"",""MANAGERLASTNAME"",""MANAGEREMAIL""";\r\n
    Ligne après le traitement :
    SESAID,"ALTERNATEIDS","PLATFORM","PLATFORMOWNER","PUBLISHER","APPLICATIONNAME","HFMCODE","CURRENTLYACTIVE","ACTIVATEDATE","DEACTIVATEDATE","GROUPNAME","OFFICECOUNTRY","FIRSTNAME","LASTNAME","COMPANYNAME","JOBCODE","REPORTINGENTITY",
    "BUSINESSUNITNAME","LOCATION","INTERNETADDRESS","MANAGERFIRSTNAME","MANAGERLASTNAME","MANAGEREMAIL"""
    On voit que les lignes 8, 9 et 10 ont bien joué leur rôle, sauf au niveau du dernier élément de la ligne : ""MANAGEREMAIL""".

    Après le code des ligne 8 et 9, on a ""MANAGEREMAIL""" ce qui semble correct : le \r\n a été supprimé par la ligne 8 et le point-virgule a été supprimé par la ligne 9.

    Par contre après l'exécution des lignes 10 et 11, on a "MANAGEREMAIL""". Donc la ligne 10 a bien remplacé le "" par " partout sauf à la fin de la ligne mais n'a pas touché au """ alors que j'aurais compris si on avait eu "" mais en admettant que ça ne se fasse pas, la ligne 11 aurait bien du remplacer """ par " . Que nenni. Comment faire , SVP ?

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 323
    Billets dans le blog
    17
    Par défaut
    C'est vraiment la catastrophe ton CSV et ton script.
    En plus tu utilises une classe CSV d'une manière détournée (je ne pense pas que le rewind() soit prévu) qui vient encore compliquer la situation.

    Le temps que tu obtiennes un CSV conforme il faut faire simple, quitte à avoir un script spécifique au fichier pourri que tu reçois.

    Spécificités du CSV pourri :
    -- Ligne avec double codage CSV : codage de la ligne, et codage du 1er champ
    -- Codage de la ligne : séparateur ; et délimiteur ", 1er champ embarque la data, 2nd champ vide
    -- Codage du 1er champ (le seul à avoir de la data sur ce que tu nous montres) : séparateur , et délimiteur "

    Voilà comment tu peux parcourir ton CSV :

    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
    <?php
     
    $fp = fopen(__DIR__ . '/data.csv', 'r');
     
    if (fread($fp, 3) !== "\xEF\xBB\xBF") { // Gestion du BOM
        rewind($fp); // Si pas de BOM on lit depuis le début
    } // Sinon on poursuit à partir du 4e octet du fichier...
     
    $header = fgetcsv($fp, 0, ';', '"', ''); // Décodage de la ligne d'en-tête
    $header = str_getcsv($header[0], ',', '"', ''); // Décodage du 1er champ d'en-tête
     
    while ($entry = fgetcsv($fp, 0, ';', '"', '')) { // Décodage de la ligne de données
        $entry = str_getcsv($entry[0], ',', '"', ''); // Décodage du 1er champ de la ligne de données
        $entry = array_combine($header, $entry); // Constitution de l'enregistrement
        print_r($entry);
    }
    Cela donne :

    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
    Array
    (
        [SESAID] => SESA1000
        [ALTERNATEIDS] => (none)
        [PLATFORM] => Software Engineering
        [PLATFORMOWNER] => SESA84441
        [PUBLISHER] => Atlassian
        [APPLICATIONNAME] => JIRA Global Instance
        [HFMCODE] =>
        [CURRENTLYACTIVE] => True
        [ACTIVATEDATE] => Jan 01, 2021
        [DEACTIVATEDATE] =>
        [GROUPNAME] =>
        [OFFICECOUNTRY] => Spain
        [FIRSTNAME] => Miguel
        [LASTNAME] => Abad
        [COMPANYNAME] => SCHNEIDER ELECTRIC ESPANA, S.A.U.
        [JOBCODE] => FKP8
        [REPORTINGENTITY] =>
        [BUSINESSUNITNAME] => Global Finance
        [LOCATION] => BARCELONA (BAC DE RODA)
        [INTERNETADDRESS] => adresse.mail@se.com
        [MANAGERFIRSTNAME] => Alistair
        [MANAGERLASTNAME] => Mckelvie
        [MANAGEREMAIL] => manager.adresse.mail@se.com
    )
    Voilà, c'est pas plus compliqué.

    Bien sûr, comme tu donnes toujours tout au compte-goutte je m'attends à ce que ça se complique

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    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 493
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse nocturne !

    Certes, le CSV n'est pas top mais je ne le maîtrise pas ; j'essaie de le traiter. C'est en fait un export d'une base de données qui le produit. J'ai demandé au responsable s'il pouvait modifier le format de l'export mais il est en vacances.
    I think that the format of the CSV files exported from ARM database is not correct. I take as example the header and one record line.
    Today, we have:

    "SESAID,""ALTERNATEIDS"",""PLATFORM"",""PLATFORMOWNER"",""PUBLISHER"",""APPLICATIONNAME"",""HFMCODE"",""CURRENTLYACTIVE"",""ACTIVATEDATE"",""DEACTIVATEDATE"",""GROUPNAME"",""OFFICECOUNTRY"",""FIRSTNAME"",""LASTNAME"",""COMPANYNAME"",
    ""JOBCODE"",""REPORTINGENTITY"",""BUSINESSUNITNAME"",""LOCATION"",""INTERNETADDRESS"",""MANAGERFIRSTNAME"",""MANAGERLASTNAME"",""MANAGEREMAIL"""

    "SESA1000,""(none)"",""Software Engineering"",""SESA84441"",""Atlassian"",""JIRA Global Instance"","""",""True"",""Jan 01, 2021"","""","""",""Spain"",""Miguel"",""Abad"",""SCHNEIDER ELECTRIC ESPANA, S.A.U."",""FKP8"","""",""Global Finance"",""BARCELONA (BAC DE RODA)"",""mail.address@se.com"",""Alistair"",""Mckelvie"",""manager.mail.address@se.com"""

    The right format should be:

    SESAID,"ALTERNATEIDS","PLATFORM","PLATFORMOWNER","PUBLISHER","APPLICATIONNAME","HFMCODE","CURRENTLYACTIVE","ACTIVATEDATE","DEACTIVATEDATE",GROUPNAME","OFFICECOUNTRY","FIRSTNAME","LASTNAME","COMPANYNAME","JOBCODE",
    "REPORTINGENTITY","BUSINESSUNITNAME","LOCATION","INTERNETADDRESS","MANAGERFIRSTNAME","MANAGERLASTNAME","MANAGEREMAIL"

    SESA1000,"(none)","Software Engineering","SESA84441","Atlassian","JIRA Global Instance","","True","Jan 01, 2021","","","Spain","Miguel","Abad","SCHNEIDER ELECTRIC ESPANA, S.A.U.","FKP8","","Global Finance","BARCELONA (BAC DE RODA)","mail.address@se.com","Alistair","Mckelvie","manager.mail.address@se.com"

    Can you check the data extraction method, in order to get correct / valid csv file? (the mail address are modified for confidentiality reason)
    Il est américain.

    Si je donne les infos qu'au compte-goutte, c'est que je ne donne que ce qui me paraît utile, pour ne pas donner un code énorme.

    J'ai du adapter ton code, mais ça m'a fait avancer (le header est désormais correctement déterminé).

    Par contre, la lecture des enregistrements contenus dans le CSV, j'ai du la mettre ailleurs, car pour chaque ligne, je fais un traitement (analyse et éventuellement mise en base de données) et pour éviter des problèmes de mémoire, je lis une ligne et la traite immédiatement avant de lire la suivante.
    En fait, je croyais que seule, la détermination du header posait problème. Maintenant, c'est au point, mais c'est la suite qui pose problème.

    Comme ça n'a plus rien à voir avec le titre de cette discussion, je propose de la clore et d'en démarrer une nouvelle. OK ?

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 323
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Comme ça n'a plus rien à voir avec le titre de cette discussion, je propose de la clore et d'en démarrer une nouvelle. OK ?
    OK

  5. #5
    Inactif  
    Homme Profil pro
    Webmaster
    Inscrit en
    Juin 2021
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juin 2021
    Messages : 645
    Par défaut
    Laurent,

    ARRETE d'ouvrir 10000 discussions, alors que le problème est LE MÊME !!

    On ne fait que répéter encore et toujours les mêmes choses !!

    Et ça encombre inutilement le forum.

  6. #6
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    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 493
    Billets dans le blog
    1
    Par défaut
    Mon idée n'était pas de vous conduire à répéter des choses et d'autre part, même si mon nouveau problème concerne le même sujet général que le problème précédent, il est différent. Cela dit, depuis que j'ai écrit le post #3, je n'ai pas du tout travaillé sur le sujet. Je viens de me replonger dedans et en 30 secondes, j'ai eu une nouvelle idée, qui a résolu mon nouveau problème . Donc je clos cette discussion mais n'en ouvre pas une nouvelle. Certes, en testant avec un autre CSV, j'ai découvert un 3e problème, mais j'arrête aujourd'hui pour tenir le coup ce soir !

    Joyeux Noël

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

Discussions similaires

  1. Supprimer les caractères blancs en fin de ligne
    Par st20085 dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 06/09/2006, 22h51

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