=> Diff

C’est une fonction capable de donner les différences entre deux entités (texte, tableau, etc.). J’ai implémenté un algorithme populaire décrit dans la page wikipidia sur le https://en.wikipedia.org/wiki/Longest_common_subsequence_problemLCS (longest common subsequence problem)> pour traiter le cas de deux tableaux de textes à comparer élément par élément. Les utilisateurs mac ont déjà accès à une commande unix diff assez puissante.

le tableau “diff” se lit à l’envers (de la fin vers le début). C’est brut de fonderie, programmé en v12, à adapter à vos besoins :slight_smile: Au lieu de construire un tableau $tdiff, on peut faire un texte ou un tableau qui permet de donner l’ordre de lecture dans chaque tableau (notamment si on veut utiliser des données liées à l’une autre version)… Dans mon cas, je souhaitais comparer deux gammes de fabrication pour mettre en évidence les différences :

<code 4D>
// diff
// comparaison de deux tableaux de textes, ligne par ligne

C_POINTEUR($tOld;$tNew;$diff)
C_ENTIER LONG($i;$j;$m;$n)

ASSERT(Nombre de parametres=3;Nom methode courante+" nécessite 3 paramètres")

$tOld:=$1
$tNew:=$2
$tDiff:=$3

// générer le LCS
$m:=Taille tableau($tOld->)
$n:=Taille tableau($tNew->)

TABLEAU ENTIER LONG($c;$m;$n)

Boucle ($i;1;$m)
Boucle ($j;1;$n)
Si ($tOld->{$i}=$tNew->{$j})
$c{$i}{$j}:=$c{$i-1}{$j-1}+1
Sinon
$c{$i}{$j}:=math_max ($c{$i}{$j-1};$c{$i-1}{$j})
Fin de si
Fin de boucle
Fin de boucle

// lire le diff

$i:=$m
$j:=$n

Si (Taille tableau($tDiff->)>0)
SUPPRIMER DANS TABLEAU($tDiff->;1;Taille tableau($tDiff))
Fin de si

Repeter

Au cas ou
: ($i>0) & ($j>0) & ($told->{$i}=$tnew->{$j})
AJOUTER A TABLEAU($tDiff->;" "+$told->{$i})
$i:=$i-1
$j:=$j-1

: ($j>0) & (($i=0) | ($c{$i}{$j-1}>=$c{$i-1}{$j}))
AJOUTER A TABLEAU($tDiff->;"+"+$tnew->{$j})
$j:=$j-1

: ($i>0) & (($j=0) | ($c{$i}{$j-1}<$c{$i-1}{$j}))
AJOUTER A TABLEAU($tDiff->;"-"+$told->{$i})
$i:=$i-1

Sinon

Fin de cas

Jusque ($i=0) & ($j=0)

</code 4D>

Math_max :

<code 4D>
// ----------------------------------------------------
// Méthode : math_max
// Description
// math_max ( num1 ; num2 { ; numN } )
// retourne dans $0 le nombre le plus grand
//
// ----------------------------------------------------

C_REEL($max)
C_ENTIER LONG($i)

Si (Nombre de parametres<1)
ALERTE(Nom methode courante+" prend au moins 1 paramètre !")
$0:=0
Sinon
$max:=$1
Boucle ($i;2;Nombre de parametres)
Si ($max<${$i})
$max:=${$i}
Fin de si
Fin de boucle
$0:=$max
Fin de si

</code 4D>

Exemple d’utilisation :

<code 4D>
TABLEAU TEXTE($t1;0)

AJOUTER A TABLEAU($t1;“rouge”)
AJOUTER A TABLEAU($t1;“vert”)
AJOUTER A TABLEAU($t1;“bleu”)
AJOUTER A TABLEAU($t1;“jaune”)

TABLEAU TEXTE($t2;0)
AJOUTER A TABLEAU($t2;“rouge”)
AJOUTER A TABLEAU($t2;“orange”)
AJOUTER A TABLEAU($t2;“vert”)
AJOUTER A TABLEAU($t2;“mauve”)
AJOUTER A TABLEAU($t2;“jaune”)

TABLEAU TEXTE($tDiff;0)

diff (->$t1;->$t2;->$tDiff)

</code 4D>

Donne, dans le tableau $tDiff de la fin vers le début :

rouge
+orange
vert
-bleu
+mauve
jaune