rechercher les elements d'un fuchier dans un autre fichier

Petit nouveau ! | 6 Messages

24 mai 2005, 22:20

salut a tous !

voila mon probleme:

je dispose de deux fichiers texte. L'un contient une liste de genes (un par ligne), l'autre contient une liste de genes et synonymes (tous les synonymes sont sur la meme ligne).

Ce que je veux faire:
pour chaque gene du premier fichier, je veux chercher s'il est present dans le second et si c'est le cas recuperer la ligne ou il se trouve , c'est a dire ses synonymes.

quelqu'un peut il m'aider??
merci d'avance!

Mammouth du PHP | 19672 Messages

24 mai 2005, 22:59

SAlut,
là, il va falloir lire les fichiers ligne par ligne et enregistrer chaque ligne dans des tableau indexés et ensuite faire des comparaisons. pour trouver les correspondances. Tu sais comment faire ou tu n'en as pas la moindre idée ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

24 mai 2005, 23:15

la j'avoue que j'ai du mal, peux tu m'en dire un peu plus??
merci !

Mammouth du PHP | 19672 Messages

24 mai 2005, 23:50

Ok,
le principe est grosso modo le suivant: on lit un fichier et chaque ligne est virtuellement inscrite dans une cellule de tableau.
On fait deux tableaux (variables de type array), un pour chaque fichier.

Ensuite, pour chaque occurence du premier tableau, on va chercher un (ou plusieurs ?) ligne(s) dans le second tableau.

Voilà pour le principe. Pour ça, on utilisera les fonction du genre fread() ou fgets() par exemple et pour ça on utilisera des expressions régulières.

Si va toujours jusque là, as-tu une idée de comment procéder ? :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

25 mai 2005, 00:19

salut cyrano,

j'ai essayer de suivre tes conseils et voila le code que j'ai ecrit:

Code : Tout sélectionner

$file1 = "gene.txt"; $file2 = "gene-synonyme.txt"; function ListFromFile($fname){ $lst=Array(); if(file_exists($fname)){ $f=fopen($fname,'r+'); $lst=explode("\n",fread($f,filesize($fname))); fclose($f); } return $lst; } $lst1=ListFromFile($file1); $cnt1=count($lst1); //aff_tab($lst1); $lst2=ListFromFile($file2); $cnt2=count($lst2); //aff_tab($lst2); if($cnt1>0 && $cnt2>0) for($x1=0;$x1<$cnt1;$x1++){ $found=false; for($x2=0;$x2<$cnt2;$x2++){ $pos=strpos(trim($lst2[$x2]),trim($lst1[$x1])); if($pos!==false){ echo 'Correspondance trouvée pour '.$lst1[$x1]. ' à la ligne '.($x2).', position '.($pos).'.<br/>'; echo $lst2[$x2]."<BR>"; $found=true; break; } } //if(!$found) // echo 'Correspondance non trouvée pour '.$lst1[$x1].'.<br/>'; }
je te donne aussi un exemple de chaque fichier texte que j'utilise.
le fichier gene.txt:
ABTB1
Ac-35K/p35
AD7C-NTP
ADAMTS4
AGGF1
ALS2CR2
ANAPC10
ANK3

le fichier gene-synonyme.txt:

A1a A1, Bfl-1, Hbpa1, Bcl2a1, Bcl2a1a
A1b Bcl2a1b, A1-b
AIF Pdcd8
Ankyrin-1 ANK1, ANK, SPH1, SPH2
Ankyrin-2 ANK2, Ank-2, ankyrin B
Ankyrin-3 Ank3, Ank-3, MGC14049
Apaf1 fog, Apaf-1, Apaf1l
Apollon BIRC6
Arc MYC, NOP, Nop30,Nol3

Mon code semble detecter les genes mais des prblemes subsistent:
-Correspondance trouvée pour CR2 à la ligne 156, position 12.
ligne de synonyme = TNFRSF10D, DCR2, TRUNDD, TRAILR4

ici le motif CR2 est trouve mais a l'interieur d'un gene qui n'est pas le bon.

-les indices de lignes et postion ne sont pas les bons et je ne vois pas pourqoi!

vois tu quelques chose a modifier ?

merci.

Mammouth du PHP | 19672 Messages

25 mai 2005, 07:15

Je voudrais être sûr de bien comprendre: si dans le fichier 1 tu as un gène ANK3 par exemple, tu veux retrouver dans le fichier 2 une ligne avec exactement le même motif, donc ANK3 et pas Ank ni Ank-3 ni encore xAnk34JD :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 6 Messages

25 mai 2005, 18:55

c'est exactement ce que je veux. du coup je pense qu'il faut que les genes synonymes soient separes par un separateur special et je pense devoir utiliser des expressions regulieres. qu'en pense tu ?

Mammouth du PHP | 19672 Messages

25 mai 2005, 19:07

Non, il y aurait plus simple: il faut que le tableau des synonymes soit à deux dimensions, du genre:

Code : Tout sélectionner

$fichier_2 = array(); $fichier_2[0] = array("Arc MYC", "NOP", "Nop30", "Nol3"); $fichier_2[1] = array("Apollon BIRC6"); // etc...
Comme ça, tu vérifie le contenu de chaque index en ayant chaque synonime individuellement, mais sans mélanger les lignes de synonymes et tu n'as pas besoin de bidouiller la construction de séparateurs spéciaux.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: