Parser un fichier texte en php

Résolu/Fermé
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 - 25 janv. 2008 à 10:15
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 - 25 janv. 2008 à 12:01
Bonjour à tous et toutes.

Je viens vous voir car j'ai un problème. Je suis actuellement en présence d'un fichier texte de la forme suivante :

>P1;AQP1_BOVIN|Bos_taurus

-------------------------------------MASEFKKKLFWRA
VVAEFLAMILFIFISIGSALGFHYPIKSNQTT------------GAVQDN
--VKVSLAFGLSIATLAQSVGHISGAHLNPAVTLGLLLSCQISVLRAIMY
IIAQCVGAIVA------------------TAILSGITSSLPDN-SL-GLN
ALAPGVNSGQGLGIEI-IGTLQLVLCVLATTDRRRR-D---LGGSGPLAI
GFSVALGHLLAI----DYTGCGINPARSFGSSVITH-NFQDHWIFWVGPF
IGAALAVLIYDFILAPRSSDLT---DRVKVWTSGQVEEYDLDADDINSRV
EMKPK---------------------------------------------
--------------------------------------------------
------------------
*
>P1;AQP1_SHEEP|Ovis_aries

-------------------------------------MASEFKKKLFWRA
VVAEFLAMILFIFISIGSALGFHYPIKSNQTT------------GAVQDN
--VKVSLAFGLSIATLAQSVGHISGAHLNPAVTLGLLLSCQISILRAIMY
IIAQCVGAIVA------------------TVILSGITSSLPDN-SL-GLN
ALAPGVNSGQGLGIEI-IGTLQLVLCVLATTDRRRRRD---LGDSGPLAI
GFSVALGHLLAI----DYTGCGINPARSFGSSVITH-NFQDHWIFWVGPF
IGAALAVLIYDFILAPRSSDLT---DRVKVWTSGQVEEYDLDADDINSRV
EMKPK---------------------------------------------
--------------------------------------------------
------------------

*
etc

Il s'agit de séquences protéiques après alignement mais n'ayez pas peur ma question n'a rien à voir avec la bio ;p

Je souhaiterais pouvoir extraire de ce fichier (qui continue comme cela sur des centaines de séquences) uniquement les parties contenues entre le premier tiret et l'étoile (ce que j'ai souligné dans la 2ème séquence), sachant que ça ne commence pas toujours avec des tirets (on peut avoir des lettres à la place), mais par contre ça se termine toujours par une étoile et la longueur de la partie à extraire est constante.
Et comme indiqué dans le texte, si c'était possible de le faire en php ça m'arrangerais énormément...

D'avance merci
A voir également:

4 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
25 janv. 2008 à 11:27
Bonjour,

La meilleure solution à ton problème passe par les expressions rationnelles.
Je peux te donner le code qui ira bien, mais il faut que je sois sûr de la façon dont sont formatées tes séquences.

Est-ce que tu valides ce modèle ?

[Début de la séquence 1]
>(code1);Code2|Code3 [Retour à la ligne]
[Retour à la ligne]
[Séquence à récupérer, composée uniquement de lettres en majuscule, de retours à la ligne et de tirets][Retour à la ligne]
*
[Fin de la séquence 1]

[Début de la séquence 2]
>(code1);Code2|Code3 [Retour à la ligne]
etc.

Les (code1), (code2), (code3) sont composés uniquement de lettres et de chiffres ainsi que du symbole "_".


Et tu voudrais avoir tout ça dans un tableau, par exemple ?


Si on valide ce modèle, voilà le code que je te propose :
<?php
    $contenuFichier = file_get_contents("nom_fichier.txt");
    $expressionRationnelle = "/>[a-zA-Z0-9_]+;[a-zA-Z0-9_]+\|[a-zA-Z0-9_]+\s*([^\*]+)\s*\*/";
    $resultat = Array();

    preg_match_all($expressionRationnelle, $contenuFichier, $resultat, PREG_PATTERN_ORDER);

    // $resultat devrait contenir toutes les séquences recherchées. On les affiche pour vérification :
    foreach ($resultat[0] as $numero => $sequence)
    {
        echo "<b>Séquence $numero</b><blockquote>$sequence</blockquote>";
    }
?>
(Pour information : https://www.php.net/manual/fr/function.preg-match-all.php)

Voilà !
J'espère que ça te suffira :)

Xavier
1
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
25 janv. 2008 à 11:47
Merci beaucoup de t'intéresser à moi Xavier :D
Concernant le modèle on est tout à fait d'accord sur la structure. Concernant les expressions rationnelles je m'en doutais un peu mais j'avoue que aujourd'hui je n'ai absolument pas le temps de me mettre dedans (moi être petit stagiaire pressé de toute part par le temps...)

J'ai testé ton code mais il m'affiche :

Séquence 0

>P1;AQP1_BOVIN|Bos_taurus -------------------------------------------------- -------------------------------------------------- -------------------------------------MASEFKKKLFWRA VVAEFLAMILFIFISIGSALGFHYPIKSNQTT------------GAVQDN --VKVSLAFGLSIATLAQSVGHISGAHLNPAVTLGLLLSCQISVLRAIMY IIAQCVGAIVA------------------TAILSGITSSLPDN-SL-GLN ALAPGVNSGQGLGIEI-IGTLQLVLCVLATTDRRRR-D---LGGSGPLAI GFSVALGHLLAI----DYTGCGINPARSFGSSVITH-NFQDHWIFWVGPF IGAALAVLIYDFILAPRSSDLT---DRVKVWTSGQVEEYDLDADDINSRV EMKPK--------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------ *

Séquence 1

>P1;AQP1_SHEEP|Ovis_aries -------------------------------------------------- -------------------------------------------------- -------------------------------------MASEFKKKLFWRA VVAEFLAMILFIFISIGSALGFHYPIKSNQTT------------GAVQDN --VKVSLAFGLSIATLAQS
etc

je m'était peut être mal exprimé mais ce que j'aurais voulu c'est supprimer de ">P1" à "taurus" par exemple dans la séquence 1.
Je viens également de m'apercevoir que toutes les séquences commencent par ">P1;" si ça peut t'aider.

Encore merci

Sylvain
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
25 janv. 2008 à 11:55
Oups, petite coquille de ma part.

Le résultat voulu n'est pas dans $resultat[0] mais dans $resultat[1].

Donc à l'affichage, remplace foreach($resultat[0]...) par foreach($resultat[1]...)
Et tu as ce que tu voulais ;)

Xavier
0
sly-bzh Messages postés 415 Date d'inscription jeudi 10 janvier 2008 Statut Membre Dernière intervention 5 décembre 2009 118
25 janv. 2008 à 12:01
Merci beaucoup tu me sauve la vie (enfin pas au sens strict du terme mais bon quand même ça m'aide énormément !!!)
Et promis dès que j'ai le temps je me met aux regex
0