Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comparer deux fichiers

6 réponses
Avatar
programmation
Bonjour,

J'ai deux fichiers "exemple.txt" et "essai.txt"
J'aime afficher les lignes qui existent dans "exemple.txt" et qui
n'existent pas dans "essai.txt"
c'est comme une sorte de la diff=E9rence.

Chaque ligne de fichier contient une chaine de caract=E8re.
Mon id=E9e :
pour chaque ligne de "exemple.txt" je teste si elle existe dans
"essai.txt".
Si oui je l'affiche.

Le probl=E8me que on peut trouver la m=EAme chaine de caract=E8re de
"exemple.txt" mais dont l'ordre des mots formant cette chaine est
diff=E9rent de celui dans "essai.txt"

on affiche la chaine autant qui se compose de m=EAmes mots.

Soit le fichier "exemple.txt"

nom prenom
nom age
nom prenom age
nom emploi
age emploi
prenom age empoi
nom age emploi
nom prenom emploi
nom prenom age emploi


Soit le fichier "essai.txt"

nom
prenom
age
emploi
age nom
nom age prenom
nom emploi
age emploi
prenom age empoi
nom prenom emploi
nom prenom age emploi


le r=E9sultat souhait=E9 est:

nom prenom
nom age
nom age emploi


Comment on obtient ce r=E9sultat ?

Merci.

6 réponses

Avatar
programmation
bonjour,
Je vous explique ma demande.
Soit le premier fichier fichier "f.txt":
nom prenom
nom age
nom prenom age
nom emploi
age emploi
prenom age emploi
nom age emploi
nom prenom emploi
nom prenom age emploi

Soit le deuxième fichier "f2.txt":

nom
prenom
age
emploi
age nom
nom age prenom
nom emploi
age emploi
prenom age emploi
nom prenom emploi
nom prenom age emploi

votre solution donne:
nom prenom
nom age
nom prenom age

C'est à dire les lignes qui appartiennent à "f.txt" et n'appartiennent
pas à "f2.txt"


Mais, moi je cherche les lignes qui appartiennent à "f.txt" et
n'appartiennent pas à "f2.txt"
avec les mots de chaque ligne ne sont pas les mêmes
quelque soit l'ordre.

par exemple,
Dans la ligne de "f.txt":
nom age
est le même que dans "f2.txt" :
age emploi

car les deux lignes ont le même ensemble des mots {nom, age}

Donc le résultat ne contient pas la ligne: nom age


de même Dans la ligne de "f.txt":
nom prenom age
est le même que dans "f2.txt" :
nom age prenom


Enfin en se basant sur l'hypothèse que on compare les lignes qui ont
les mêmes mots quelque soit l'ordre

Donc on obtient comme résultat:
nom prenom
nom age emploi

Avez-vous une proposition car j'ai trouvé une difficulté de dire deux
lignes sont les mêmes avec leurs mots qui forment ces deux lignes dans
un ordre différent ?


Merci.
Avatar
jerome
"programmation" a écrit dans le message de news:

Bonjour,
J'ai deux fichiers "exemple.txt" et "essai.txt"
J'aime afficher les lignes qui existent dans "exemple.txt" et qui
n'existent pas dans "essai.txt"
c'est comme une sorte de la différence.
..
Le problème que on peut trouver la même chaine de caractère de
"exemple.txt" mais dont l'ordre des mots formant cette chaine est
différent de celui dans "essai.txt"
on affiche la chaine autant qui se compose de mêmes mots.



Utilise un tableau pour chaque fichier.
Ensuite, ce n'est plus que des recherches de chaines ou parties de chaines
dans les tableaux.
Avatar
programmation
bonjour,

Je vous explique mon problème.
Soit le premier fichier fichier "f.txt":
nom prenom
nom age
nom prenom age
nom emploi
age emploi
prenom age emploi
nom age emploi
nom prenom emploi
nom prenom age emploi

Soit le deuxième fichier "f2.txt":

nom
prenom
age
emploi
age nom
nom age prenom
nom emploi
age emploi
prenom age emploi
nom prenom emploi
nom prenom age emploi

Le résultat souhaité:
nom prenom
nom age emploi

Je cherche les lignes qui appartiennent à "f.txt" et non pas "f2.txt"
C'est une sorte de différence lignes de "f.txt" moins lignes de
"f2.txt"
à condition:
Une ligne de "f.txt" est identique à une ligne de "f2.txt"
si les deux lignes ont la même valeur et le même nombre des mots qui
forment les deux lignes quelque soit l'ordre des mots puisque l'ordre
des mots n'est pas important dans mon problème.
le plus important c'est : la même valeur et le même nombre

Sinon c'est à dire les deux lignes n'ont pas la même valeur et le mêm e
nombre des mots alors dans ce cas les deux lignes sont différentes.

par exemple:
"nom prenom age" = "nom age prenom"

et donc l'ordre est ignoré.

J'espère que je le problème est clair sinon je vous explique encore.

Sachant que chaque ligne du deux fichiers "f.txt" et "f2.txt" est
composé d'un seul champ (une chaine de caractères).

Le remplissage de deux fichiers se fait par:

fprintf(fp,"%s",s); //le fichier "f.txt"

fprintf(fp2,"%s",s); //le fichier "f2.txt"

J'ai besoin de vos aides.

Merci.
Avatar
programmation
Bonjour,
Voici un premier essai:

[code=cpp]#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

FILE *f,*f2 ;
char s[1000], s2[1000];

f = fopen("f.txt", "r");
f2 = fopen("f2.txt", "r");
while(fgets(s, 1000, f)!= NULL)
{

rewind(f2);
while(fgets(s2, 1000, f2)!= NULL)
if(strcmp(s, s2))
printf("%sn",s);

}
fclose(f);
fclose(f2);
return 0;
}
[/code]

Mais cette solution tient de l'ordre des mots de deux lignes pour
chaque fichier.
"nom prenom age" est différent " nom age prenom"

j'ai dit il suffit de changer cette condition: if(!strcmp(s, s2))
par un truc comme if(same_word(s, s2)) .
mais, je trouve difficulté de implémenter
la fonction same_word(s, s2)

Comment je vais modifier cette solution pour ignorer l'ordre.
pour obtenir:

"nom prenom age" = " nom age prenom"

Merci.
Avatar
marc
programmation a écrit :
//
Comment je vais modifier cette solution pour ignorer l'ordre.
pour obtenir:

"nom prenom age" = " nom age prenom"



Découpe en mots et pour chacun appelle strstr() pour savoir s'il est
dans l'autre chaine
Avatar
programmation
On 27 août, 11:52, marc wrote:
programmation a écrit :

> //
> Comment je vais modifier cette solution pour ignorer l'ordre.
> pour obtenir:

>  "nom prenom age" = " nom age prenom"

Découpe en mots et pour chacun appelle strstr() pour savoir s'il est
dans l'autre chaine



Bonjour,
Mon problème concernant le critère de la comparaison de deux fichiers
a été modifié.
Je vous explique :
On n'affiche pas dans la console les lignes identiques.
la condition que deux lignes sont identiques ne tient pas de l'ordre
par exemple:
"a b c" = "b c a"

Mais, une autre condition qui s'ajoute :on n'affiche pas les lignes de
"f.txt" qui sont inclus dans "f2.txt"
par exemple:
"a c" est inclue dans "b c a"
"b c" est inclue dans "b c a"

Donc ou lieu d'obtenir comme résultat :
a b
b c
b d
c d
a b d
b c d
a c d
a b c d

Alors si on ajoute la condition d'inclusion, on va obtenir le résultat
suivant:

b d
c d
a b d
b c d
a c d
a b c d

Ceci c'est comment on fait la comparaison entre deux fichiers.

J'ai voulu composer mon problèmes en sous problèmes pour que soit
lisible.

Je vous explique le problème en totalité:

J'ai un fichier de base qui doit être exister qui s'appelle "f.txt"
Soit le fichier "f.txt":
a b
a c
a d
b c
b d
c d
a b c
a b d
b c d
a c d
a b c d

et j'ai d'autres fichiers qui leur nombre varie. Mais au moins j'ai un
et je peux avoir N fichiers.
Supposons que on a N=3.
Donc on a 3 fichiers respectivement: "f1.txt", "f2.txt" et "f3.txt"
Soit "f1.txt" :
a
d a
c a
b c a

Soit "f2.txt" :
a
c
b
d
b a
d a
b c
d c
b c a

Soit "f3.txt" :
a
b
c
c a
d a
b a
b c
b c a

Je voudrais chercher comme j'ai dit avant les lignes qui appartiennent
au "f.txt" et qui vérifient les deux conditions c'est à dire :
l'ignorance de l'ordre et inclusion.

Je vais appliquer votre idée successivement entre:
- "f.txt" et "f1.txt"
- "f.txt" et "f2.txt"
- "f.txt" et "f3.txt"

C'est bon j'obtiens le résultat pour:
- "f.txt" et "f1.txt"
b d
c d
a b d
b c d
a c d
a b c d

- "f.txt" et "f2.txt"
b d
a b d
b c d
a c d
a b c d

- "f.txt" et "f3.txt"
b d
c d
a b d
b c d
a c d
a b c d

Le travail est de chercher l'intersection entre ces résultats obtenus.


Le résultat souhaité obtenu à la fin est :
b d
a b d
b c d
a c d
a b c d

Enfin, nous cherchons dans ce résultat la ligne qui n'est pas incluse
dans les autres lignes de ce même résultat.
on a :
"a b d" contient "b d"
"b c d" contient "b d"
"a b c d" contient "b d"

Et donc nous obtenons le résultat final de ce problème:
b d
a c d

Que pensez vous de cette idée ?
Que proposez vous comme structure de donnée pour sauvegarder les
résultats obtenus entre deux fichiers puis pour faire l'intersection
entre ces résultats ?
Pouvez vous poster votre solution pour que je vois comment je vais
l'exploiter ?

J'ai besoin de vos aides.

Merci.