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 :

rectification d'un fichier (csv/txt) [PHP 5.5]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut rectification d'un fichier (csv/txt)
    Bonjour,
    j'ai un CSV qui contient les informations suivantes :
    "toto","","","123654","","","2011",""
    "titi","","","456789","","","2011",""
    "roro","","","147852","","","2011","2015"
    "toto","","","258987","","","2011",""
    "nono","","","369123","","","2011","2019"
    Je vais transformer en rectifiant la ligne 3 et 5 dans ce cas :
    "toto","","","123654","","","2011",""
    "titi","","","456789","","","2011",""
    "roro","","","147852","","","2015",""
    "toto","","","258987","","","2011",""
    "nono","","","369123","","","2019",""
    Vous pouvez m'aider pour cela ? Comment puis-je le faire ?
    Je le trouve la ligne 3 et 5 avec ce 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
    15
    16
    17
    18
    19
    20
    21
    <?php
    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    $nomDuFichier = $root . '/data/mcrsft.txt';
     
    // trouver derniere chaine 
    if (($handle = fopen($nomDuFichier, "r")) !== FALSE) { //en lecture seule et place le pointeur de fichier au début du fichier.
     
        while (($dataLue = fgetcsv($handle, 1000, ",")) !== FALSE) {
          /*undefined offset
          $trouverChaineAremplacer  = $dataLue[6];
          $trouverChaineAvider  = $dataLue[7];
           */ 
          $trouverChaineAremplacer  = !empty($dataLue[6]) ? $dataLue[6] :'';
          $trouverChaineAvider  = !empty($dataLue[7]) ? $dataLue[7] :''; 
     
          echo '<p>' . $trouverChaineAremplacer . ' - ' . $trouverChaineAvider . '</p>';
     
     
     
       }
    }
    voici ce que je vois sur l'écran :
    2011 -

    2011 -

    2011 - 2015

    2011 -

    2011 - 2019

    2011 -
    Par contre, je ne trouve pas la solution pour changer les valeurs comme les suivantes :
    2011

    2011

    2015

    2011

    2019

    2011
    Ensuite, il faut que je les change dans le fichier : mcrsft.tx

    Est-ce que vous avez une idée ?

    Un grand merci

  2. #2
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    J'ai essayé avec cela, mais je n'arrive pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //après la ligne 21
    //la ligne 22...
     
    // changer la valeur
          if (!empty($trouverChaineAvider)){
              $trouverChaineAremplacer = $trouverChaineAvider;
          }
     
          // vider la valeur
          $trouverChaineAvider;

  3. #3
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut faire simple :
    la colonne 6 prend la valeur colonne 7 si elle existe
    la colonne 7 est vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $new_file = fopen('newfile.csv', 'w');
     
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
          $data[6] = ($data[7] !== '') ? $data[7] : $data[6];
          $data[7] = '';
          fputcsv($new_file, $data);
    }
     
    fclose($newfile);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Bonjour sabotage,

    Merci pour cette solution...
    Mais il y a un pépin :

    Avec le code suivant, mon fichier ne contient que de virgules : 232 464 virgules c'est tout.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    $nomDuFichier = $root . '/data/mcrsft.txt';
     
    $new_file = fopen($nomDuFichier, 'w');
     
    while (($data = fgetcsv($nomDuFichier, 1000, ",")) !== FALSE) {
          $data[6] = ($data[7] !== '') ? $data[7] : $data[6];
          $data[7] = '';
          fputcsv($new_file, $data);
    }
     
    fclose($new_file);
    En outre,

    j'ai des alertes :

    Warning: fgetcsv() expects parameter 1 to be resource, string given in E:\site\test.php on line 6

  5. #5
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    J'ai changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //$new_file = fopen($nomDuFichier, 'w');
    $new_file = fopen($nomDuFichier, 'r+');
    j'obtiens cela :
    Notice: Undefined offset: 7 in E:\site\test.php on line 7
    Ligne 7 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
          $data[6] = ($data[7] !== '') ? $data[7] : $data[6];
    Et le nouveau contenu du mon fichier c'est :
    "toto","","","123654","","","2011",""
    toto,,,123654,,,2011,
    "","","2011",""
    ,,2011,,,
    "","147852","","","2011","2015"
    ,147852,,,2011,2015,,
    "","","2011",""
    ,,2011,,,
    "","369123","","","2011","2019"
    ,369123,,,2011,2019,,

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    "new_file" c'est le fichier resultat ; c'est un fichier différent.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Bonjour sabotage,

    Merci pour les explications, mais j'ai encore un petit problème avec le contenu de mon nouveau fichier.

    J'ai rectifié ton code comme tu dis :
    Voici le 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    $nomDuFichierATraiter = $root . '/data/mcrsft.txt'; // fichier contient la data à traiter
     
     
    $new_file = fopen($root . '/data/mcrsft_new.txt', 'w'); // ouvrir le nouveau fichier 
     
     
    if (($handle = fopen($nomDuFichierATraiter, "r")) !== FALSE) { //en lecture seule et place le pointeur de fichier au début du fichier.
     
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
          $data[6] = ($data[7] !== '') ? $data[7] : $data[6];
          $data[7] = '';
     
          fputcsv($new_file, $data);
     
     
     
       }
    }
     
    fclose($new_file);
    et voici le contenu de mon nouveau fichier :
    """toto""",,,123654,,,2011,
    titi,,,456789,,,2011,
    roro,,,147852,,,2015,
    toto,,,258987,,,2011,
    nono,,,369123,,,2019,
    Pourtant j'aimerais bien obtenir comme cela :

    "toto","","","123654","","","2011"
    "titi","","","456789","","","2011"
    "roro","","","147852","","","2015"
    "toto","","","258987","","","2011"
    "nono","","","369123","","","2019"

    ou bien comme cela :


    "toto","","","123654","","","2011",""
    "titi","","","456789","","","2011",""
    "roro","","","147852","","","2015",""
    "toto","","","258987","","","2011",""
    "nono","","","369123","","","2019",""

    En fait, le même format que mon fichier d'origine

    Merci et bonne soirée

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il suffit de préciser les paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fputcsv($new_file, $data,',','"');
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Merci sabotage,

    J'ai testé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fputcsv($new_file, $data,',','"');
    mais je l'obtiens que cela :
    """toto""",,,123654,,,2011,
    titi,,,456789,,,2011,
    roro,,,147852,,,2015,
    toto,,,258987,,,2011,
    nono,,,369123,,,2019,

  10. #10
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    J'ai fait un var_dump avant fputcv :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var_dump($data);
    fputcsv($new_file, $data,',','"');
    et voici :
    array(8) {
    [0]=>
    string(9) ""toto""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(6) "123654"
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(4) "2011"
    [7]=>
    string(0) ""
    }
    array(8) {
    [0]=>
    string(4) "titi"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(6) "456789"
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(4) "2011"
    [7]=>
    string(0) ""
    }
    array(8) {
    [0]=>
    string(4) "roro"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(6) "147852"
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(4) "2015"
    [7]=>
    string(0) ""
    }
    array(8) {
    [0]=>
    string(4) "toto"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(6) "258987"
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(4) "2011"
    [7]=>
    string(0) ""
    }
    array(8) {
    [0]=>
    string(4) "nono"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(6) "369123"
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(4) "2019"
    [7]=>
    string(0) ""
    }
    Je me demande pourquoi la première a de doubles guillemets ?

  11. #11
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    J’ai trouvé la raison de doubles guillemets :
    Le fichier était UTF-8 et lorsque je le mets en UT-8 (sans BOM) sous NotePad++
    Il n’y a plus de doubles guillemets dans mon array
    array(8) {
    [0]=>
    string(4) "toto"
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(6) "123654"
    [4]=>
    string(0) ""
    [5]=>
    string(0) ""
    [6]=>
    string(4) "2011"
    [7]=>
    string(0) ""
    }
    Alors mon nouveau fichier est toujours sans guillemets :
    Nom : new.JPG
Affichages : 148
Taille : 18,3 Ko
    et comment puis-je avoir le même format que l'origine avec guillemets et CRLF à la fin de chaque ligne ?:
    Nom : origine.JPG
Affichages : 138
Taille : 25,8 Ko

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Pourquoi veux-tu des guillemets ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Pourquoi veux-tu des guillemets ?
    C'est mon fournisseur qui veut...
    Mais il fait le test sans guillemets et dans quelques minutes, il va me dire s'il peut accepter dans guillemets.
    Par contre, il veut absolument CRLF.
    Comment puis-je mettre CRLF à la fin de chaque ligne ?

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il va falloir se passer de fputcsv est écrire ta ligne à la main.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  15. #15
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Salut Sabotage,

    Ça marche sans guillemets, mais il faudrait toujours CRLF.
    Est ce qu'il ne faut plus utiliser fputcsv ?
    Comment je peux les mettre à la main ?

    Citation Envoyé par sabotage Voir le message
    Il va falloir se passer de fputcsv est écrire ta ligne à la main.
    Je n'ai pas compris ?

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite($new_file, '"' . implode('","', $data) . '"' . "\r\n");
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #17
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Salut sabotage,

    C'est excellent, ça marche avec ton code

    Avant ta solution : J'ai ajouté PHP_EOL puisque data[7] est vide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $data[6] = ($data[7] !== '') ? $data[7] : $data[6];
          //$data[7] = '';
          $data[7] = PHP_EOL;
    Mais CRLF est entre guillemets :
    Nom : new2.JPG
Affichages : 140
Taille : 22,8 Ko
    Puisque ton code marche, tout va bien... : voici la totalité de ton 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    $root = realpath($_SERVER["DOCUMENT_ROOT"]);
    $nomDuFichierATraiter = $root . '/data/mcrsft.txt'; // fichier contient la data à traiter
     
     
    $new_file = fopen($root . '/data/mcrsft_new.txt', 'w'); // ouvrir le nouveau fichier 
     
     
    if (($handle = fopen($nomDuFichierATraiter, "r")) !== FALSE) { //en lecture seule et place le pointeur de fichier au début du fichier.
     
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
          $data[6] = ($data[7] !== '') ? $data[7] : $data[6];
          $data[7] = '';
          //$data[7] = PHP_EOL;
     
          //fputcsv($new_file, $data,',','"');
          //fputcsv($new_file, $data,',');
          //fwrite($new_file, $data); // : write() expects parameter 2 to be string, array given in
          fwrite($new_file, '"' . implode('","', $data) . '"' . "\r\n"); 
     
     
     
       }
    }
     
    fclose($new_file);
    Je suis curieux de savoir : une question rapide :
    comment peut-on décider encodage du fichier ?

    Un grand merci

  18. #18
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu veux dire faire son choix parmi les encodages ou définir l'encodage de ton CSV ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  19. #19
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    Oui sabotage,

    Comme tu dis
    Citation Envoyé par sabotage Voir le message
    faire son choix parmi les encodages ou définir l'encodage de ton CSV ?
    Celui qui est nouveau ?

    un grand merci

  20. #20
    Membre habitué
    Homme Profil pro
    Aprenti
    Inscrit en
    Mai 2015
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Aprenti

    Informations forums :
    Inscription : Mai 2015
    Messages : 199
    Points : 140
    Points
    140
    Par défaut
    en attendant tes reflexion, je vais mettre l'étiquette : Resolu

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

Discussions similaires

  1. Importer fusionner fichiers csv,txt
    Par christine854 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 11/09/2016, 17h20
  2. Réponses: 3
    Dernier message: 11/01/2015, 20h00
  3. Réponses: 11
    Dernier message: 27/10/2008, 09h15
  4. [VBA-E]Ouvrir un fichier.csv ou un fichier.txt séparateur ";"
    Par ouskel'n'or dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 30/05/2007, 12h09
  5. Ecrire dans un fichier .csv ou .txt à partir d'excel
    Par Beamish dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 02/03/2007, 12h16

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