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 :

parser un txt


Sujet :

Langage PHP

  1. #1
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut parser un txt
    Bonjour a tous,

    je suis debutant en PHP et je voudrais faire un exercice un peu compliqué.

    J'ai 2 fichiers appelons les data et keys
    Dans le fichier data j'ai une serie de registres (ce sont des doc biliographiques).
    Dans le segond fichier j'ai a peu pret la meme chose + des ID.
    Chaque ID est unique et correspond a une chaine bien specifique.

    Pour diferencier les registres du fichier data, l'on peu utiliser le premier champ
    =LDR
    un ligne blanche separe les registre, voici un exemple du fichier:

    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
    =LDR  01228nam  2200301 b 4500
    =001  00000000000001
    =005  20090429:10082000
    =008  060403\2004\\\\\\\\\\\\\\\\\\\\\\\\baq
    =008  120114s9999\\\\xx\\\\\\\\\\\\000\0\und\d
    =019  \\$aM-34416-2004
    =020  \\$a84-667-3834-7
    =027  \\$a11100
    =024  \\\$a9
    =100  1\$aFerrero, Luis
    =245  10$aMatematika$b :2:  Irakasleentzako materiala$c / Luis Ferrero, María del Carmen Jiménez, María Gregoria Martín
    =260  \\$aMadrid$b : Anaya-Haritza$c, 2004
    =300  \\$a4 bolumen dituen karpeta  (159, 31, 39, 95 or.)$c ; 32 x 26 cm
    =440  \0$aApain eta dotore
    =500  \\$a2004.10.19
    =505  0\$a1. bolumena: Proposamen didaktikoa$a -- 2. bolumena: Programazioa$a -- 3. bolumena: Ebaluazioa$a -- 4. bolumena: Aniztasunaren tratamendua
    =521  0\$a2.maila
    =650  \4$aLMH - Matematika
    =700  1\$aJimenez, Maria del Carmen
    =700  1\$aMart��n, María Gregoria
    =856  \\$u http://www.anaya.es$z Argitaletxearen web-orria
    =856  \\$u http://www.hezkuntza.ejgv.euskadi.net/r43-573/eu/contenidos/informacion/dih6/eu_15733/adjuntos/8466738347.pdf$z Aurkibidea
    =952  \\$p1000001$8LH$d05/04/06$aEK$bEK$oI LH2 MAT 1 04$eANA$s05/04/06
    =998  \\9
     
    =LDR  01239nam  2200373 b 4500
    =001  00000000000003
    =005  20081212:09412200
    ...
    et ainsi de suite.

    l'exercice consiste a parser le champ 650 du fichier data:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =650  \4$aLMH - Matematika
    Ça peu aussi etre comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =650  \4$a Etika
    =650  \4$aPatristika
    =650  \4$aFilosofia
    ou comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =650  \4$aMusika$x-Historia eta kritika
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =650  \4$a Haurren heziketa$j-Ipuinak$j-Haur eta gaztentzako liburuak
    Les champs 650 sont composés de sous champs visibles par des lettres.
    a, ou x ou j ou y, z

    Pour toutes les combinaisons du fichier data il existe une correspondance dans le fichier keys.
    L'ecercice consiste a recuperer l'ID du fichier keys et de le coller a la fin de la ligne 650 du fichier data.

    voici comment se presente les données dans keys:
    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
    ..MARC..
    TITN
         15
    LD05
         n
    LD06
         a
    LD07
         m
    LD18
         b
    T001
         00000000000006
    T005
         20091214:11502100
    T008
         060403s2005    espa   c      000 1 baq c
    T019
    ...
    T650
         ' 4''a' Haurren heziketa'j'-Ipuinak'j'-Haur eta gaztentzako liburuak'ZZ0004537'
    ..MARC
    Voyez dans le fichier keys, j'ai aussi un champs 650 (T650) et il termine par un numero...C'est ce numero que je soouhaite recuperer.

    Dans notre exemple ça serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =650  \4$a Haurren heziketa$j-Ipuinak$j-Haur eta gaztentzako liburuak$90004537

    J'ai commencer avec ce petit bout de code, mais je sais pas comment mettre dans une variable une chaine et ensuite la comparer dans l'autre fichier:

    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
    <?
    if (!$fp = fopen("cata.txt","r")) {
    echo "Echec de l'ouverture du fichier";
    exit;
    }
    else {
    	while(!feof($fp)) {
    	// On récupère une ligne
    		$Ligne = fgets($fp,255);
     
    	// On affiche la ligne
    		echo $Ligne;
     
    	// On stocke l'ensemble des lignes dans une variable
    		$Fichier .= $Ligne;
    	}
    	fclose($fp); // On ferme le fichier
    }
     
    ?>
    J'aurais besoin de quelque clefss s'il vous plait.
    Cordialement

  2. #2
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Bonjour,

    Citation Envoyé par Idiaz
    je suis debutant en PHP et je voudrais faire un exercice un peu compliqué.
    Ah ah ! Pardon
    C'est en se lançant des défie qu'on progresse

    Alors si j'ai bien compris tu souhaite récupérer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' 4''a' Haurren heziketa'j'-Ipuinak'j'-Haur eta gaztentzako liburuak'ZZ0004537'
    Et plus particulierement le numéro à la fin : 'ZZ0004537'.

    Est-ce que tous les numéros que tu souhaites récupéré possède des ' en début et fin de chaîne ?

    Si c'est le cas ce serra très simple avec explode().

    Citation Envoyé par Idiaz
    je sais pas comment mettre dans une variable une chaine
    Rien de plus simple il te suffit d'écrire $maVar = $Ligne; une fois que tu est sûr que c'est la bonne. Et il faut bien évidement déclarer la variable avant la boucle pour pouvoir l'utiliser à l'exterieur.

  3. #3
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut
    oui tous les numero du fichier keys ont des '' pour delimieter.

    Le probleme c'est que si un champs 650 possede la lettre a x et j
    c'est different de la meme chose avec a et x
    ou a et z
    Meme si a possede la meme valeur.

    Et en plus, comment passer l'ID au fichier data et le coller a la bonne place?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2011
    Messages : 24
    Points : 25
    Points
    25
    Par défaut
    Je n'ai pas très bien compris ce que tu souhaite faire, mais tu devrais te diriger vers les regex (expressions régulières), c'est assez lourd mais pratique.

  5. #5
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut a tous,

    je vais essayer de simplifier ma demande.

    Pour ce faire, je vais expliquer par fonction.
    La premiere chose que je souhaite faire c'est lire un fichier txt... Pour ça j'ai ce petit bout de code qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
     for( $i = 1 ; $i < count($tabfich) ; $i++ ){
    	echo $tabfich[$i];
     }
    ?>
    Dans ce fichier, je dois detecter un champ specialement, celui qui commence par =650:

    La deja je sais pas comment faire pour dire a php de seulement ce centrer sur ce qui commence par =650 et passer du reste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    =500  \\$a2004.07.16
    =521  0\$a3.maila
    =650  \4$aDBH - Gizarte Zientziak, Geografia eta Historia$90002964=856  \\$u http://www.oup.com$z Argitaletxearen web-orria
    =952  \\$p1000151$8DBH$d28/04/06$aEK$bEK$oI DBH3 GE0 24 04$eOXF$s28/04/06
    ...

    J'essaye ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
    	for( $i = 1 ; $i < count($tabfich) ; $i++ ){
    		if(substr($tabfich[$i],0,4)=="=650")
    			echo $tabfich[$i];
    	}
    ?>
    Ça marche j'ai tous les =650 et pas le reste.

    Et dans ce champ je dois recuperer tout le texte qui se trouve entre el $a et le $9

    C'est a dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBH - Gizarte Zientziak, Geografia eta Historia
    J'essaie ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
    	for( $i = 1 ; $i < count($tabfich) ; $i++ ){
    		if(substr($tabfich[$i],0,4)=="=650")
    			preg_match("(^a)", $tabfich[$i], $resultat);
    	}
    	echo $resultat;
    ?>
    Et la...j'y arrive pas.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    foreach pour parcourir un tableau

  7. #7
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Salut
    foreach... avec la boucle for ça marche pareil??

    J'ai avancé depuis le post de ce matin, je suis a la phase ou j'arrive pas a isoler le string entre $a et $9...
    Tu connais l'astuce pour faire ça?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    foreach... avec la boucle for ça marche pareil??
    http://php.net/manual/fr/control-structures.foreach.php


    c'est la base de PHP

  9. #9
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Ok alors selon le web que tu m'envoie j'ai changé le code a ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
     foreach ($tabfich as &$value) {
    	if(substr($value,0,4)=="=650")
    		echo $value;
    	}
    ?>
    J'ai la liste des =650 ça c'est bien, maintenant il faut que j'isole le string compris entre le $a et le $9...
    La je bloque.

    Voici un output:

    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
    =650  \4$a Euskal poesia$x-Historia eta kritika$90002839
    =650  \4$aEuskara$j-Ordenagailu jokoak$90002944
    =650  \4$aEuskara$j-Ordenagailu jokoak$90002944
    =650  \4$a Matematika$j-Ordenagailu jokoak$90002940
    =650  14$aTeknologia$j-Ordenagailu jokoak$90002946
    =650  14$aNatur Zientziak$j-Ordenagailu jokoak$90002935
    =650  \4$aLMH - Natura, Gizarte eta Kultura Ingurunearen Ezaguera$j-Ordenagailu programak$90003035
    =650  14$aOrdenagailu jokoak$90002939
    =650  \4$aGeografia$j-Ordenagailu jokoak$90002941
    =650  \4$aEuskara$x-Programazioa$j-Ordenagailu programak$90002960
    =650  \1$aIkastetxeen kudeaketa$x-Ordutegiak$j-Ordenagailu programak$90002978
    =650  \1$aIkasteknikak$j-Ordenagailu programak$90002958
    =650  \1$aLogopedia$j-Ordenagailu programak$90004827
    =650  \4$aOsasun hezkuntza$x-Drogak$90002874
    =650  \1$aOsasun hezkuntza$x-Drogak$90002874
    =650  \4$aGizarte-komunikazioa$90001462
    =650  14$aOsasun hezkuntza$x-Drogak$90002874
    =650  14$aOsasun hezkuntza$x-Drogak$90002874
    =650  \4$aKirolak$x-Dopatzea$90007344
    =650  \4$aLan giroko harremanak$90001557

  10. #10
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    J'essaie ceci mais ça donne erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
     foreach ($tabfich as &$value) {
    	if(substr($value,0,4)=="=650")
    		ereg("(^\$a)",$value,$mival);
    		echo $mival[1];
    	}
    ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PHP Notice:  Undefined variable: mival in C:\test.php on line 7

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    on utilise preg pas ereg, je vais regarder ton truc cette aprem

  12. #12
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    Je tatone la,

    j'ai reussi a isoler presque 100% bien la chaine:
    avec ceci
    J'utilise juste une ligne dans $data au lieu de parcourir tout le fichier, pour tester:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
     
     $data="=650  14\aTeknologia\j-Ordenagailu jokoak\90002946";
     $mival=strstr($data,"\9",true);
     $mival1= strstr($mival,"\a",false);
     echo $mival1;
    ?>

    J'obtient ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    \aTeknologia\j-Ordenagailu jokoak
    Premiere observation, j'ai dû remplacer les $ dans la chaine car php me disait: variable $a non definie.
    Donc pas de soucis, je peux changer le fichier source ou faire un replace.
    Ensuite reste a enlever les 2 premiers caracteres de la chaine le "\a"

  13. #13
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    J'arrive a faire presque ce que je voulais faire grace a ceci:
    d'abord je fais un sed pour changer le $a et $9 pour chaque =650
    car php pense que c'est une variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed '/=650/s/\$9/||9/' out1.txt >out.txt
    sed '/=650/s/\$a/||a/' out.txt >out1.txt
    Ensuite, ce code affiche les strings...mais avec les ||a et ||9
    Je voudrais maintenant avoir les meme strings mais sans les ||a et ||9

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
     
      foreach ($tabfich as &$value) {
    	if(substr($value,0,4)=="=650"){
    		$mival=strstr($value,"||9",true);
    		$mival1= strstr($mival,"||a",false);
    		echo $mival1."<p>";
    	}
     }
     
    ?>

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    j'ai relu ton premier poste

    d’où sort : 90004537 ?
    d'où sorte les fichiers ?
    quelle est le format final que tu souhaites avoir ?
    c'est toujours 650 ?

  15. #15
    Membre actif
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Points : 289
    Points
    289
    Par défaut
    En fait y'a 2 fichiers et je dois combiner les 2.

    C'est a dire ajouter un ID dans le fichier 2 a partir d'un ID qui se trouve dans le fichier 1.

    D'ou le premier pas qui consiste a isoler la chaine commune des 2 fichiers:
    avec mon petit script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php 
     $fichier="out.txt"; 
     $tabfich=file($fichier); 
     
      foreach ($tabfich as &$value) {
    	if(substr($value,0,4)=="=650"){
    		$mival=strstr($value,"||9",true);
    		$mival1= strstr($mival,"||a",false);
    		echo $mival1."\n";
    	}
     }
    ?>
    J'arrive a generer ceci sur le fichier 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ||aEuskal literatura$x-Historia eta kritika
    ||aEuskal literatura$x-Historia eta kritika
    ||aEuskal literatura$x-Historia eta kritika
    ||aEuskal literatura$x-Historia eta kritika
    ||aDBH - Euskara eta Literatura
    ||aDBH - Euskara eta Literatura
    ||aDBH - Euskara eta Literatura
    A part les "||a" que je dois virer, cette chaine est exactement la même dans le fichier 2,
    donc le but final est:
    lire le fichier 2, (il ressemble a ça)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    =LDR  00092nz   2200049n  4500
    =150  \\$aFilosofia
    =550  \\$wh$aFilosofia Analitikoa
    detecter les champs =150
    et trouver l'ID du fichier 1 pour toutes les valeur identiques (fichier2 =150 egale a fichier1 =650)

    Par exemple, dans le fichier 1 j'ai ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    650  \4||aFilosofia||90000007
    comme tu vois, dans le fichier 1 j'ai une egalité avec le fichier2 champs =150 et =650
    il faut copier l'ID du fichier1 et le coller dans le fichier2 en ajoutant un string fix devant
    resultat final:
    Generer un fichier2 comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    =LDR  00092nz   2200049n  4500
    =150  \\$aFilosofia
    =550  \\$wh$aFilosofia Analitikoa
    =034 \\$a0000007

Discussions similaires

  1. parser un .txt
    Par dimtri16 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 09/09/2011, 14h01
  2. Script shell pour parser un fichier txt
    Par pcsystemd dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 30/09/2008, 09h32
  3. Comment parser un fichier.txt sous Access?
    Par takepaf dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 11h15
  4. Parser un fichier txt
    Par takepaf dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/05/2007, 11h29
  5. Parser un fichier TXT
    Par Blaireau dans le forum Langage
    Réponses: 5
    Dernier message: 08/08/2006, 20h28

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