2013-04-11 4 views

Répondre

1

Afficher ce script.

sdiff.py @ hungrysnake.net

http://hungrysnake.net/doc/software__sdiff_py.html

de sdiff Perl (algorithme :: Diff) ne pense pas que sur les "taux de correspondance", mais la sdiff.py python penser. =)

J'ai 2 fichiers texte.

$ cat text1.txt 
aaaaaa 
bbbbbb 
cccccc 
dddddd 
eeeeee 
ffffff 

$ cat text2.txt 
aaaaaa 
bbbbbb 
xxxxxxx 
ccccccy 
zzzzzzz 
eeeeee 
ffffff 

J'obtenu côte à côte diff par commande sdiff ou la sdiff de Perl (algorithme de Diff).

$ sdiff text1.txt text2.txt 
aaaaaa   aaaaaa 
bbbbbb   bbbbbb 
cccccc  | xxxxxxx 
dddddd  | ccccccy 
      > zzzzzzz 
eeeeee   eeeeee 
ffffff   ffffff 

sdiff ne pense pas que sur les "taux de correspondance" = (

Je l'ai par sdiff.py

$ sdiff.py text1.txt text2.txt 
--- text1.txt (utf-8) 
+++ text2.txt (utf-8) 
1|aaaaaa    1|aaaaaa 
2|bbbbbb    2|bbbbbb 
    |   >  3|xxxxxxx 
3|cccccc  |  4|ccccccy 
4|dddddd  <  | 
    |   >  5|zzzzzzz 
5|eeeeee    6|eeeeee 
6|ffffff    7|ffffff 

[  ]  |  + 
[ <- ]  3|cccccc 
[ -> ]  4|ccccccy 

Sdiff.py penser à "taux de correspondance" =)

Je veux un résultat par sdiff.py. pas vous?

1

Il n'y a pas de code direct c dans difflib pour afficher les lignes modifiées comme dans le sdiff de Perl dont vous avez parlé. Mais vous pouvez en faire un facilement. Dans le delta de difflib, les "lignes modifiées" ont également '- ', mais contrairement aux lignes effacées, la ligne suivante dans le delta est marquée '? ' pour indiquer que la ligne dans l'index précédent du delta est "modifiée", et non supprimé Un autre objectif de cette ligne dans le delta est qu'il sert de «guide» quant à l'endroit où les changements sont dans la ligne.

Ainsi, si une ligne dans le delta est marqué avec '- ', alors il y a quatre cas différents selon les quelques lignes du delta:

Cas 1: La ligne modifiée par insertion certains caractères

- The good bad 
+ The good the bad 
?   ++++ 

cas 2: La ligne est modifiée par la suppressioncertains caractères

- The good the bad 
?   ---- 
+ The good bad 

Cas 3: la ligne est modifiée par la suppression et l'insertion et/ou remplaçant certains caractères:

- The good the bad and ugly 
?  ^^ ---- 
+ The g00d bad and the ugly 
?  ^^   ++++ 

Cas 4: la ligne est supprimé

- The good the bad and the ugly 
+ Our ratio is less than 0.75! 

Comme vous pouvez le constater, les lignes marquées '? ' indiquent exactement le type de modification effectué.

Notez que difflib considère qu'une ligne est supprimée si la valeur de ratio() entre les deux lignes comparées est inférieure à 0,75. C'est une valeur que j'ai découverte grâce à certains tests.

Donc, pour déduire une ligne comme modifiée, vous pouvez le faire. Cela renverra les diffs avec des lignes modifiées taggés avec 'c', le code et les lignes inchangées dans la catégorie 'u', tout comme dans le sdiff de Perl:

def sdiffer(s1, s2): 
    differ = difflib.Differ() 
    diffs = list(differ.compare(s1, s2)) 

    i = 0 
    sdiffs = [] 
    length = len(diffs) 
    while i < length: 
     line = diffs[i][2:] 
     if diffs[i].startswith(' '): 
      sdiffs.append(('u', line)) 

     elif diffs[i].startswith('+ '): 
      sdiffs.append(('+', line)) 

     elif diffs[i].startswith('- '): 
      if i+1 < length and diffs[i+1].startswith('? '): # then diffs[i+2] starts with ('+ '), obviously 
       sdiffs.append(('c', line)) 
       i += 3 if i + 3 < length and diffs[i + 3].startswith('? ') else 2 

      elif diffs[i+1].startswith('+ ') and i+2<length and diffs[i+2].startswith('? '): 
       sdiffs.append(('c', line)) 
       i += 2 
      else: 
       sdiffs.append(('-', line)) 
     i += 1 
    return sdiffs 

Hope it helps.

P.S.: C'est une vieille question, donc je ne sais pas si mes efforts seront récompensés. :-( Je n'ai pas pu m'empêcher de répondre à cette question, car j'ai travaillé un peu avec difflib ces derniers temps.

0

Je ne sais pas très bien ce qu'est l'opération "Change" de Perl. Si elle correspond à la production PHP DIFF, je résoudre mon problème avec ce code:

def sdiffer(s1, s2): 
    differ = difflib.Differ() 
    diffs = list(differ.compare(s1, s2)) 

    i = 0 
    sdiffs = [] 
    length = len(diffs) 
    sequence = 0 
    while i < length: 
     line = diffs[i][2:] 
     if diffs[i].startswith(' '): 
      sequence +=1 
      sdiffs.append((sequence,'u', line)) 

     elif diffs[i].startswith('+ '): 
      sequence +=1 
      sdiffs.append((sequence,'+', line)) 

     elif diffs[i].startswith('- '): 
      sequence +=1 
      sdiffs.append((sequence,'-',diffs[i][2:])) 
      if i+1 < length and diffs[i+1].startswith('? '): 
       if diffs[i+3].startswith('?') and i+3 < length : # case 2 
        sequence +=1 
        sdiffs.append((sequence,'+',diffs[i+2][2:])) 
        i+=3 
       elif diffs[i+2].startswith('?') and i+2 < length: # case 3 
        sequence +=1 
        sdiffs.append((sequence,'+',diffs[i+2][2:])) 
        i+=2 
      elif diffs[i+1].startswith('+ ') and i+2<length and diffs[i+2].startswith('? '): # case 1 
       sequence +=1 
       sdiffs.append((sequence,'+', diffs[i+1][2:])) 
       i += 2 
      else: # the line is deleted and inserted new line # case 4 
       sequence +=1 
       sdiffs.append((sequence,'+', diffs[i+1][2:])) 
       i+=1 
     i += 1 
    return sdiffs 

Merci @ Sнаđошƒаӽ pour votre code.

Questions connexes