Rechercher : dans
Par :

Parser un fichier texte en php

Dernière réponse le 25 jan 2008 à 12:01:45 sly-bzh, le 25 jan 2008 à 10:15:30 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « parser un fichier texte en php » dans :
MySQL - Chargement d'un fichier texte dans une table VoirPour charger une fichier texte défini comme suit : $ tail /home/user1/test.txt 'nom1',1,9 'nom2',2,3 'nom3',3,54 'nom4',4,2 'nom5',5,9 Dans une table définie comme suit : CREATE TABLE chargertest ( ...
[PHP] Upload de fichiers VoirLe langage PHP permet de gérer des fichiers envoyés (uploadés) grâce à un formulaire HTML. Formulaire d'envoi de fichiers Configuration de PHP pour permettre l'upload Récupération du fichier avec PHP Formulaire d'envoi de fichiers La...
PHP - Parser du XML VoirIntroduction à XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de...
PHP - Affichage de texte sur le navigateur VoirLe but de PHP est de permettre la création de pages web dynamiques, ainsi son but premier est de pouvoir envoyer des données au navigateur. Les trois fonctions standards PHP fournit 3 fonctions permettant d'envoyer du texte au navigateur. Ces...
PHP - Les fichiers VoirLa gestion des fichiers avec PHP Avec PHP, la création ou la lecture de fichiers est, une fois de plus, assez simple. Il existe une multitude de fonctions dédiées à l'utilisation des fichiers. La communication entre le script PHP et le fichier...

1

Reivax962, le 25 jan 2008 à 11:27:36

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 : http://fr.php.net/manual/fr/function.preg-match-all.php)

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

Xavier

Répondre à Reivax962

2

sly-bzh, le 25 jan 2008 à 11:47:56

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

Répondre à sly-bzh

3

Reivax962, le 25 jan 2008 à 11:55:00

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

Répondre à Reivax962

4

 sly-bzh, le 25 jan 2008 à 12:01:45

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

Répondre à sly-bzh