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 :

traitement du fichier texte avec PHP,


Sujet :

Langage PHP

  1. #1
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Points : 241
    Points
    241
    Par défaut traitement du fichier texte avec PHP,
    Bonjour tout le monde ,j'éspére que tous va bien chez vous
    bon j'ai un fichier txt que j'aimerais bien le traiter, il est sous cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    N=0,x=23928392,y=2091039,zone=1
    N=0,x=59091212,y=6766566,zone=1
    N=0,x=23928392,y=2091039,zone=1
    N=1,x=45450909,y=6766566,zone=1
    N=1,x=23928392,y=2091039,zone=1
    N=1,x=45450909,y=6766566,zone=1
    N=2,x=23928392,y=2091039,zone=2
    N=2,x=23928392,y=6766566,zone=2
    N=2,x=23928392,y=2091039,zone=2
    les contraintes que j'ai, pour les lignes qui ont le même numéro ,la premiere et la dérniere ligne doivent avoir la méme X et Y et zone, sinon le fichier est invalide .
    aprés le test,j'aimerais bien récuperer ts les X et Y et les mettes dans une chaine de caractére ,
    j'ai commencé le developpement , j'ai ouvri le fichier, afficher son contenu , mettre chaque ligne dans un indice d'n tableau,et je me suis bloqué dans la récupération des valeurs x et y de chaque N(numero),
    quelq'un à une idée , méerci en avance

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    tu bloques à quel niveau ?
    Voilà un code qui te permet de récupérer tes valeurs et/ou tester si le fichier est valide en considérant les N sont triés et qu'un N unique est valide, si tu ne comprends pas tout n'hésite pas à demander :

    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
    39
    40
    41
    42
    43
    44
    45
    46
     
    // Récupère le fichier dans tableau
    $lines = file('file.txt');
    $data = array();
    // parcours le tableau et crée les variables
    for($i = 0, $c = count($lines); $i < $c; $i++)  {
        $line = explode(',', $lines[$i]);
     
        $n = explode('=', $line[0]);
        $n = $n[1];
     
        $data[$n][] = $lines[$i];
     
        $x = explode('=', $line[1]);
        $x = $x[1];
     
        $y = explode('=', $line[2]);
        $y = $y[1];
     
        $z = explode('=', $line[3]);
        $z = $z[1];
     
        echo 'N='.$n.',x='.$x.',y='.$y.',zone='.$z.'<br>';
    }
     
    echo '<pre>';
    var_dump($data);
    echo '</pre>';
     
    // Teste si la première ligne est égale à la dernière ligne pour chaque groupe de N
    $valid = true;
    if(!empty($data))    {
        for($i = 0, $c = count($data); $i < $c; $i++)  {
            if(count($data[$i]) > 1)    {
                if($data[$i][0] !== $data[$i][count($data[$i]) - 1])    {
                    $valid = false;
                    break;
                }
            }
        }
    }
    else    {
        $valid = false;
    }
     
    var_dump($valid);

  3. #3
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Points : 241
    Points
    241
    Par défaut
    Bonjour ,
    Merci pour votre réponse qui marche trés bien .
    j'ai une question à propos ces lignes pour tester si la premiére ligne est égale à la dérniére ligne de la méme groupe de N:
    déja $data[$n][] = $lines[$i]; contient les lignes du fichier txt .
    $data est un tableau à deux dimensions .
    j'ai pas compris ces liggnes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for($i = 0, $c = count($data); $i < $c; $i++)  {
            if(count($data[$i]) > 1)    { // pour testé si le tableau contient au moins une ligne
                if($data[$i][0] !== $data[$i][count($data[$i]) - 1])    { // j'ai pas compris ce test 
                    $valid = false;
                    break;
                }
            }
        }

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if($data[$i][0] !== $data[$i][count($data[$i]) - 1])    {
    En fait, on teste juste si, pour un même N, la ligne 0 est égale à la dernière ligne du tableau. count() donne la taille du tableau donc count($data[$i]) - 1 permet d'accéder à la dernière entrée du tableau. Pour simplifier, sur un tableau à 1 dimension ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $arr[0] = "aaaa";
    $arr[1] = "bbbb";
    $arr[2] = "ccccc";
     
    if($arr[0] !== $arr[count($arr) - 1])
     
    //et équivaut à :
     
    if($arr[0] !== $arr[2])
     
    // donc :
     
    if("aaaa" !== "cccc")

    Par contre dans le code de départ, je me suis planté c'est ça qu'il faudrait mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(count($data[$i]) > 0)    {
    ou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!empty($data[$i]))    {
    Sinon un bon moyen pour voir comment est structuré un tableau est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo '<pre>';
    var_dump($data);
    echo '</pre>';

  5. #5
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Points : 241
    Points
    241
    Par défaut
    Merci beaucoup Djakisback,
    j'ai bien compris le code, pour le test entre la premiere ligne et la derniere ligne du méme groupe de N , il me donne toujours false !!
    le code parrait logique, mais retourne toujours false , j'ai verifié coté fichier txt ,il est bien réglé !!
    j'ai pas arrivé à trouvé d'où vient le probléme ?

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Est-ce que tu as bien mis le code en entier ? car il faut initialiser $valid ) true au début :

    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
    // Teste si la première ligne est égale à la dernière ligne pour chaque groupe de N
    $valid = true;
    if(!empty($data))    {
        for($i = 0, $c = count($data); $i < $c; $i++)  {
            if(!empty($data[$i]))    {
                if($data[$i][0] !== $data[$i][count($data[$i]) - 1])    {
                    $valid = false;
                    break;
                }
            }
        }
    }
    else    {
        $valid = false;
    }
    Si oui, peux-tu ajouter un var_dump() dans la boucle pour voir ce qui sort ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    var_dump($data[$i]);
            if(!empty($data[$i]))    {
    ...

  7. #7
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    bon en vérifiant la longeur de chaque contenu du $data[$i][$j], j'ai trouvé que toutes les lignesont un méme longeur 33 sauf la dériniere ligne avec 31 charactéres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for($i = 0, $c = count($data); $i < $c; $i++)  {
    for($j = 0, $c = count($data); $j < $c; $j++)  {
     
    	echo 'la chaine : ' .$data[$i][$j].' sa longeur est :'.strlen($data[$i][$j]).'<br>';
    }
     }
    il me donne ce résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    la chaine : N=0,x=23928392,y=2091039,zone=1 sa longeur est :33
    la chaine : N=0,x=59091212,y=6766566,zone=1 sa longeur est :33
    la chaine : N=0,x=23928392,y=2091039,zone=1 sa longeur est :33
    la chaine : N=1,x=45450909,y=6766566,zone=1 sa longeur est :33
    la chaine : N=1,x=23928392,y=2091039,zone=1 sa longeur est :33
    la chaine : N=1,x=45450909,y=6766566,zone=1 sa longeur est :33
    la chaine : N=2,x=23928392,y=2091039,zone=2 sa longeur est :33
    la chaine : N=2,x=23928192,y=6766566,zone=2 sa longeur est :33
    la chaine : N=2,x=23928392,y=2091039,zone=2 sa longeur est :31
    string(6) "false"
    c'est pour cela qu'il me donne toujours false
    maintenant pourquoi la dérniere lignes prend juste 31 caractéres ?
    normalement les chaines contiennent seulement 31 caractéres , je sais pas pourquoi il ajoutes 2 caractére ??
    une idée

  8. #8
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Oui, c'est parce que file() conserve par défaut les sauts de ligne, il faut lui passer un paramètre supplémentaire si tu n'as pas de saut de ligne après la dernière ligne de ton fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $lines = file('file.txt', FILE_IGNORE_NEW_LINES);
    Le saut de ligne sous windows c'est \r\n donc 2 char en plus, d'où la différence de longueur de chaîne. (j'avais zappé ça )

  9. #9
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Points : 241
    Points
    241
    Par défaut
    Merci Djakisback,
    FILE_IGNORE_NEW_LINES résout le probléme .
    Crdt

  10. #10
    Membre actif
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2009
    Messages
    447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mai 2009
    Messages : 447
    Points : 241
    Points
    241
    Par défaut
    Bonjour,

    comment puis je faire pour que : pour chaque groupe de N, je crée une chaîne contenant x' 'y,x' 'y comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (23928392 2091039,59091212 6766566,23928392 2091039)
    j'ai fait une chaîne qui rassemble tous les x et y, mais j'aimerais bien les séparer .

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

Discussions similaires

  1. [JDOM] Problème avec le traitement de fichier texte
    Par hedibox dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 24/08/2013, 14h49
  2. Récupération dans un fichier texte avec PHP
    Par bombers dans le forum Langage
    Réponses: 10
    Dernier message: 15/03/2013, 15h41
  3. Afficher le contenu d'un fichier texte avec des balise PHP
    Par bastian06n dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2010, 10h30
  4. [MySQL] Importation de fichier texte avec traitement des caractères spéciaux
    Par runcafre91 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/12/2009, 22h28
  5. Réponses: 9
    Dernier message: 22/05/2006, 12h21

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