Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/04/2008, 10h14   #1
Modérateur
 
Avatar de Er3van
 
Homme Clément
Architecte Logiciel
Inscription : avril 2008
Messages : 1 370
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte Logiciel
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 1 370
Points : 2 093
Points : 2 093
Par défaut Script PHP pour lister les différences entre deux fichiers

Bonjour,

Comme le titre l'indique, j'ai fait un script PHP pour lister les différences entre deux fichiers, d'extensions quelconques, et ligne par ligne.

Seulement vous vous en doutez puisque j'ai créer un topic, ça ne marche pas comme je l'aurai souhaité !

Ci dessous mon algo :

Code :
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
function comparer ($urlFichierSRC, $urlFichierDST) {
	// -- Compare le contenu du fichier source avec le contenu du fichier destination
	// -- Renvoie un tableau contenant toutes les différences du fichier destination par rapport au fichier source
 
	$tabFichierSRC = file($urlFichierSRC) ; // On stocke le contenu du fichier source dans la tableau tabFichierSRC
	$tabFichierDST = file($urlFichierDST) ; // On stocke le contenu du fichier destination dans la tableau tabFichierDST
	$tabDiff = array() ;
 
	for ( $i = 0, $j = 0; $i < count($tabFichierSRC) || $j < count($tabFichierDST) ; $i++, $j++ ) { // Tant qu'il y a des lignes à lire dans l'un des deux fichiers
 
		if ( isset($tabFichierDST[$j]) && isset($tabFichierSRC[$i]) && $tabFichierDST[$j] != $tabFichierSRC[$i] ) {
 
			$inser = rechercher( $tabFichierDST, $j, count($tabFichierDST), $tabFichierSRC[$i] ) ;
 
			if ( $inser != 0 ) { // Il s'agit d'une insertion
				$t = 0 ;
				while ( $t < $inser ) {
					if ( $tabFichierDST[$j] != '' ) {
						$tabDiff[$j] = "Insertion" ;
					}
					$t++ ;
					$j++ ;
				}
			}
			else { // Si la recherche n'a pas trouvé d'élément de SRC à la suite de DST : Il ne s'agit pas d'une insertion
				$suppr = rechercher( $tabFichierSRC, $i, count($tabFichierSRC), $tabFichierDST[$j] ) ;
				if ( $suppr != 0 ) { // Il s'agit d'une suppression
					$t = 0 ;
					while ( $t < $suppr ) {
						if ( $tabFichierSRC[$i] != '' ) {
							$tabDiff[$i] = "Suppression" ;
						}
						$t++ ;
						$i++ ;
					}
				}
				else { // Si la recherche n'a pas trouvé d'élément de DST dans la suite de SRC : Il ne s'agit pas d'une suppression
					$tabDiff[$j] = "Modification" ;
				}
			}
		}
		else // Sinon les lignes sont équivalentes
			$tabDiff[$i] = "Identique" ;
	}
	return $tabDiff ;
}
 
function rechercher ( $tab, $k, $l, $ligne ) {
 
	$cpt = 0 ;
	for ( $s = $k ; $s < $l ; $s++ ) {
		if ( $tab[$s] == $ligne ) {
			return $cpt ;
		}
		$cpt++ ;
	}
	return 0 ;
}
Le tableau $tabDiff est ensuite récuppéré et on fait apparaître le résultat dans une vue.

L'algo marche presque bien, mais il y a des erreurs, au niveau algorithmique a priori. Avec des jeux d'essais j'arrive à faire apparaitre facilement des lacunes, certaines insertions sont prises pour des modifications par exemple.
Je galère dessus depuis une bonne dizaine d'heure, et malgré des modifications "censées", l'algorithme corrige certaines erreurs par d'autres....Bref je ne m'en sors pas....

Si qqun a une suggestion, remarque, j'suis preneur !
Er3van est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 10h37   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
Bonjour,

comme ceci, un var_dump de $tabDiff; me semble correcte, mais je n'ai tester que sur deux fichier.

Code :
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
function comparer ($urlFichierSRC, $urlFichierDST) {
	// -- Compare le contenu du fichier source avec le contenu du fichier destination
	// -- Renvoie un tableau contenant toutes les différences du fichier destination par rapport au fichier source
 
	$tabFichierSRC = file($urlFichierSRC) ; // On stocke le contenu du fichier source dans la tableau tabFichierSRC
	$tabFichierDST = file($urlFichierDST) ; // On stocke le contenu du fichier destination dans la tableau tabFichierDST
	$tabDiff = array() ;
 
	$count  = ( count($tabFichierSRC) < count($tabFichierDST) )?count($tabFichierDST):count($tabFichierSRC);
 
	for ( $i = 0; $i < $count ; $i++) { // Tant qu'il y a des lignes à lire dans l'un des deux fichiers
 
		if ( isset($tabFichierDST[$i]) && isset($tabFichierSRC[$i]) && $tabFichierDST[$i] != $tabFichierSRC[$i] ) {
 
			$inser = rechercher( $tabFichierDST, $i, count($tabFichierDST), $tabFichierSRC[$i] ) ;
 
			if ( $inser != 0 ) { // Il s'agit d'une insertion
				$t = 0 ;
				while ( $t < $inser ) {
					if ( $tabFichierDST[$i] != '' ) {
						$tabDiff[$i] = "Insertion" ;
					}
					$t++ ;
					$i++ ;
				}
			}
			else { // Si la recherche n'a pas trouvé d'élément de SRC à la suite de DST : Il ne s'agit pas d'une insertion
				$suppr = rechercher( $tabFichierSRC, $i, count($tabFichierSRC), $tabFichierDST[$i] ) ;
				if ( $suppr != 0 ) { // Il s'agit d'une suppression
					$t = 0 ;
					while ( $t < $suppr ) {
						if ( $tabFichierSRC[$i] != '' ) {
							$tabDiff[$i] = "Suppression" ;
						}
						$t++ ;
						$i++ ;
					}
				}
				else { // Si la recherche n'a pas trouvé d'élément de DST dans la suite de SRC : Il ne s'agit pas d'une suppression
					$tabDiff[$i] = "Modification" ;
				}
			}
		}
		else // Sinon les lignes sont équivalentes
			$tabDiff[$i] = "Identique" ;
	}
	return $tabDiff;
}
 
function rechercher ( $tab, $k, $l, $ligne ) {
 
	$cpt = 0 ;
	for ( $s = $k ; $s < $l ; $s++ ) {
		if ( $tab[$s] == $ligne ) {
			return $cpt ;
		}
		$cpt++ ;
	}
	return 0 ;
}
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 10h49   #3
Modérateur
 
Avatar de Er3van
 
Homme Clément
Architecte Logiciel
Inscription : avril 2008
Messages : 1 370
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte Logiciel
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 1 370
Points : 2 093
Points : 2 093
Hum....

J'ai tester avec mon jeu d'essai à l'instant est le résultat est en effet complétement différent de celui que j'obtient avec mon algo, mais pour autant, ça ne marche pas du tout ( voire encore moins :S )

Dans mon jeu d'essai je teste deux fichiers que je te joins, ainsi que l'affichage qui va avec ( faudra surement faire des ajustements pour tester )

Le but de cet algo c'est de prendre en compte les insertions et suppressions, avec ta modif, si je rajoute une ligne vide en haut de page, tout le reste est considéré comme modifié....

Voilà mon probleme : comment gérer à la fois les modifs ligne par ligne, les insertions et suppressions ?

En tout cas merci de ton aide
Fichiers attachés
Type de fichier : txt toto2.txt (792 octets, 1 affichages)
Type de fichier : txt toto.txt (744 octets, 1 affichages)
Type de fichier : php Affichage.php (1,8 Ko, 1 affichages)
Er3van est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 11h02   #4
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 183
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 183
Points : 6 470
Points : 6 470
J'essaye de comprendre.

quand tu dis comparer , c'est ligne à ligne, ou c'est n'importe où dans le fichier.

exemple

text.txt-ligne12 = toto

text2.txt-ligne147 = toto

c'est deux lignes sont identique pour toi ?



de plus
si ligne identique = insertion
si ligne en plus = modification
si ligne en moins = suppression

cela est correcte?
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2008, 11h12   #5
Modérateur
 
Avatar de Er3van
 
Homme Clément
Architecte Logiciel
Inscription : avril 2008
Messages : 1 370
Détails du profil
Informations personnelles :
Nom : Homme Clément
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Architecte Logiciel
Secteur : Industrie

Informations forums :
Inscription : avril 2008
Messages : 1 370
Points : 2 093
Points : 2 093
Pour que ce soit plus clair :

On commence par la ligne d'index 0, et on compare les lignes :

Si les lignes ont le même contenu ( "toto" et "toto" par exemple )
Alors elles sont identiques ( même index ET même contenu )

Par contre, si les lignes sont différentes, on regarde si par hasard il s'agit d'une insertion ( dans le fichier destination ), en cherchant si la ligne d'indice i se trouve plus loin dans le fichier destination.

Si ce n'est pas le cas, on regarde à l'inverse si la ligne d'indice i du fichier source n'a pas été supprimée dans le fichier de destination, pour ça, on regarde si le fichier source contient la ligne d'indice i du fichier destination

Sinon on en conclut que c'est juste une modification ponctuelle.


Exemple : ( avec l'affichage qui correspondrait )

Dans toto.txt

ceci est un test
avec une modif
du blablabla
et une suppression

Dans toto2.txt

ceci est un test
avec une modification
une insertion
sur deux lignes en plus !
même trois, ça c'est de l'insertion

du blablabla


Du coup, pour reprendre ton exemple

Citation:
text.txt-ligne12 = toto

text2.txt-ligne147 = toto

c'est deux lignes sont identique pour toi ?
Oui, ces deux lignes sont indentiques, à conditions qu'à l'indice 12 de text2 il n'y ait pas déjà "toto", dans ce cas le "toto" de text2 à l'indice 147 serait une modif ou une insertion

J'espère avoir été plus clair ^^'
Er3van est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h28.


 
 
 
 
Partenaires

Hébergement Web