IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Script PHP pour lister les différences entre deux fichiers


Sujet :

Langage PHP

  1. #1
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonjour,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ;
    }

  3. #3
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    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 Fichiers attachés
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    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?

  5. #5
    Membre chevronné Avatar de Er3van
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Avril 2008
    Messages
    1 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 430
    Points : 2 227
    Points
    2 227
    Par défaut
    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

    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 ^^'
    One minute was enough, Tyler said, a person had to work hard for it, but a minute of perfection was worth the effort. A moment was the most you could ever expect from perfection.

    -- Chuck Palahniuk, Fight Club, Chapter 3 --

Discussions similaires

  1. extraire les différences entre deux fichiers xml en python
    Par princessita dans le forum Général Python
    Réponses: 4
    Dernier message: 17/02/2014, 00h09
  2. Script pour compter les jours entre deux dates
    Par bomonde dans le forum Shell et commandes GNU
    Réponses: 12
    Dernier message: 17/10/2012, 18h54
  3. Réponses: 9
    Dernier message: 12/07/2011, 17h25
  4. Outils sur les différences entre deux fichiers XML
    Par Community Management dans le forum XML/XSL et SOAP
    Réponses: 19
    Dernier message: 21/07/2008, 15h21
  5. lister les différences entre 2 fichiers XML
    Par st20085 dans le forum Général Python
    Réponses: 1
    Dernier message: 14/12/2007, 11h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo