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 et écrire un fichier


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Lire et écrire un fichier
    Bonjour à tous,

    j'ai un fichier à lire de type tableur excel.

    Pour faciliter les choses, je l'ai converti en csv.


    Ce fichier contient une colonne rempli et le but est de compléter la seconde (ce qui revient à écrire à chaque fin de ligne).

    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
    <?php
    // 1 : on ouvre le fichier
    $monfichier = fopen('./fichiers/docTest.csv', 'r+');
    $k=0;
    while (false !== ($char = fgetc($monfichier))) {
    	$k=$k+1;
    	if($char=='\r\n'){
        	echo"<br/>";
        }else{
        	echo "$char";
        }
    }
     
    // 2 : on fera ici nos opérations sur le fichier...
     
    // 3 : quand on a fini de l'utiliser, on ferme le fichier
    fclose($monfichier);
    ?>
    Le problème c'est que peu importe que j'utilise \n ou \r\n je n'arrive pas à détecter la fin d'une ligne.

    Je me dis que que c'est parce que le caractère fin de cellule doit être différent mais je ne trouve pas....

    Je veux simplement arriver à détecter la fin d'une ligne pour écrire à la place quelque chose.

    Si je lis une ligne entière avec fgets je prends le retour à la ligne du coup je ne peux pas écrire sur la même ligne à la fin.


    Un petit coup de main serait apprécié

    EDIT: J'ai pu voir en convertissant en ascii qu'il s'agissait du char 13 CR suivi d'un espace suivi du 10 LF...il me semblait pourtant que c'était \r\n qui correspondait à ça...

    Bref bizarre, mais du coup quand je mets la condition directement sur l'ascii ça semble marcher...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 383
    Points
    383
    Par défaut
    Essaye en remplaçant '\r\n' par "\r\n" ?

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Comparer un string avec un char ? Même si ça marche je me vois pas faire ça d'un point de vue de la logique de l'algo.
    Cela dit je vais tester par curiosité pour ajouter ça à la longue liste des bizarreries de la prog des langages non typés x)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    251
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 251
    Points : 383
    Points
    383
    Par défaut
    C'est surtout que j'ai pas percuté sur le fgetc() ...

    La subtilité en php avec les apostrophes et les guillemets c'est que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    echo strlen('\r\n'); -> 4 caractères
    echo strlen("\r\n"); -> 2 caractères
    Donc dans les 2 cas, tu compares un caractère à une chaine de taille supérieure
    Tu peux utiliser fgetcsv() ( http://php.net/manual/fr/function.fgetcsv.php ) qui te convertira chaque ligne en array puis fputcsv() après avoir rajouté ta seconde colonne.

  5. #5
    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
    Comparer un string avec un char ?
    Ca n'existe pas "char" en PHP donc ton problème est résolu.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Ok merci à vous pour vos réponses.


    J'aurais une autre question quand même lié.

    Là je supposais que mon fichier serait en csv et que je pourrais le lire de cette façon caractère par caractère.

    Le soucis c'est que j'ai testé d'autres format excel et à ce moment là il semble y avoir des problèmes d'encodage et je ne récupère pas ce que je veux du coup.

    Y a t'il un moyen de rendre la lecture d'un fichier efficace pour tous les formats de fichiers tableurs excel ?

  7. #7
    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
    Ce n'est pas un problème d'encodage mais de format.
    Un fichier XLS est un fichier binaire. Un fichier XLSX est un archive zip.

    PHPExcel lit beaucoup de formats de tableurs différents.

    Au passage la lecture "caractère par caractère" c'est assez étrange quand même.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Dans l'idée je veux lire ce qui est dans la cellule A1, une fois que j'ai lu ça, j'écris dans B1
    Puis je vais lire dans A2 et écrire dans B2 etc etc

    Du coup l'idée du lire caractère par caractère c'était pour détecter le retour à la ligne et le remplacer par le texte que je veux (ce qui marche bien sur du csv par exemple avec le séparateur choisi).

    DU coup si je veux lire des fichiers xls et autres du même genre je dois m'y prendre comment ?

    J'imagine que je peux lire un fichier binaire ça devrait pas poser de soucis, mais après comment je traduis ces données là pour récupérer le texte.

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 068
    Points
    43 068
    Par défaut
    Comme indiqué par sabotage, PHPExcel te permettra de parcourir les cellules à ta guise.

    Dans le cas d'un fichier CSV, les lignes sont séparés par un retour chariot. En C j'utiliserais fgets qui lit une ligne jusqu'à détection d'un retour chariot, la fonction existe en PHP mais d'après la doc :
    Les programmeurs habitués à la programmation 'C' noteront que fgets() ne se comporte pas comme son équivalent C lors de la rencontre de la fin du fichier.
    donc bien lire la doc.

    Les champs quant à eux sont séparé par ; ou , il est facile de détecter les différents champs avec split.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  10. #10
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Je rappelle quand même que pour un fichier CSV, il y a fgetcsv et fputcsv, qui sont faites exprès pour. C'est quand même plus simple que de se prendre le chou à réinventer l'eau tiède
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  11. #11
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 068
    Points
    43 068
    Par défaut
    Je rappelle quand même que pour un fichier CSV, il y a fgetcsv et fputcsv
    Pourquoi faire simple quand on peut faire compliqué ....
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

Discussions similaires

  1. Lire et écrire un fichier de façon portable
    Par sharky.fr dans le forum C
    Réponses: 4
    Dernier message: 05/02/2009, 18h23
  2. Réponses: 1
    Dernier message: 16/09/2008, 13h30
  3. Lire et écrire un fichier XML
    Par Palca dans le forum Smalltalk
    Réponses: 0
    Dernier message: 28/04/2008, 11h40
  4. lire et écrire un fichier ppm
    Par bipbip2006 dans le forum Débuter
    Réponses: 6
    Dernier message: 08/04/2008, 16h24
  5. Réponses: 9
    Dernier message: 05/04/2005, 09h39

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