Chercher les diff. dans entre deux chaines de texte [Résolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
tmo
Messages : 5
Inscription : jeu. 08/mars/2007 14:34

Chercher les diff. dans entre deux chaines de texte [Résolu]

Message par tmo »

Je cherche à trouver les différences qui existent entre 2 chaines de texte.
Pour l'instant je teste caractéres par caractéres la cohérence entre les chaines
Comment faire pour tester par exemple dans l'exemple ci dessous le morceau de chaine " 5519 |" avec " 5518|"
sachant que les " groupes" ont une longueur differente

merci à tous ceux qui m'ont déjà aidé

Code : Tout sélectionner

control1$=" 1 | 5519 |   1 |       |  2 |        9 |     8 |"  
control2$=" 1 | 5518 |  44 |       |  2 |        9 |     8 |"  
CreateFile(0, "C:\resultat.txt")
 
  
If control1$=control2$
          MessageRequester("Information","Verif Ok !")
   Else      
         
          
           long1=Len(control1$)    
           long2=Len(control2$)      
         
         For i = 1 To long1
          
          i$=Str(i)
          
            test_car_chaine1$=Mid(control1$,i,4)
                      
            test_car_chaine2$=Mid(control2$,i,4)
            
            If   test_car_chaine1$<>  test_car_chaine2$
                WriteStringN(0,"Valeur différente position "+i$+" Champ -> "+test_car_chaine1$)    
            Else 
            
            EndIf 
            
            
          Next i  
              
            
     EndIf   
     CloseFile(0)  
Dernière modification par tmo le dim. 18/mars/2007 19:36, modifié 1 fois.
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message par brossden »

Désolé mais je ne comprends pas ton problème !
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Cherches StringField() dans l'aide Purebasic ...

Code : Tout sélectionner

Debug StringField(" 1 | 5519 |   1 |       |  2 |        9 |     8 |" ,2 ,"|")
Debug StringField(" 1 | 5518 |  44 |       |  2 |        9 |     8 |" ,2 ,"|")
minirop
Messages : 321
Inscription : mer. 02/août/2006 21:06

Message par minirop »

sinon tu peux t'inspirer des sources de diff et de la distance de Levenstein
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

sinon tu peux t'inspirer des sources de diff et de la distance de Levenstein
ce qui donnerait en purebasic, depuis le code fournit sur wiki :

Code : Tout sélectionner

entier DistanceDeLevenshtein(caractere chaine1[1..longueurChaine1], caractere chaine2[1..longueurChaine2])
   // d est un tableau de longueurChaine1+1 rangées et longueurChaine2+1 colonnes
   declarer entier d[0..longueurChaine1, 0..longueurChaine2]
   // i et j itèrent sur chaine1 et chaine2
   declarer entier i, j, coût
 
   pour i de 0 à longueurChaine1
       d[i, 0] := i
   pour j de 0 à longueurChaine2
       d[0, j] := j
 
   pour i de 1 à longueurChaine1
       pour j de 1 à longueurChaine2
           si chaine1[i] = chaine2[j] alors coût := 0
                                sinon coût := 1
           d[i, j] := minimum(
                                d[i-1, j  ] + 1,     // effacement
                                d[i , j-1] + 1,     // insertion
                                d[i-1, j-1] + coût   // substitution
                            )
 
   retourner d[longueurChaine1, longueurChaine2]

Code : Tout sélectionner

;- 
;- http://fr.wikipedia.org/wiki/Distance_de_Levenshtein
;- 

Macro GETC(string, pos = 1)
  ;Mid(string, pos, 1)
  PeekC(@string + pos - 1)
EndMacro

ProcedureDLL.l Min3(a.l, b.l, c.l)
  If (a < b) And (a < c)
    ProcedureReturn a
  ElseIf (b < a) And (b < c)
    ProcedureReturn b
  Else
    ProcedureReturn c
  EndIf
EndProcedure

ProcedureDLL.l DiffLevenshtein(chaine1.s, chaine2.s)
  
  Protected i.l, j.l, cout.l
  Protected lChaine1.l = Len(chaine1)
  Protected lChaine2.l = Len(chaine2)
  Protected Dim d.l(lChaine1, lChaine2)
  
  For i = 0 To lChaine1 
    d(i, 0) = i
  Next i
  
  For j = 0 To lChaine2 
    d(0, j) = j
  Next j
  
  For i = 1 To lChaine1 
    For j = 1 To lChaine2 
      If GETC(chaine1, i) = GETC(chaine2, j)
        cout = 0
      Else
        cout = 1
      EndIf
      d(i, j) = Min3(d(i-1, j) + 1, d(i, j-1) + 1, d(i-1, j-1) + cout)
    Next j
  Next i
  
  ProcedureReturn d(lChaine1, lChaine2)
  
EndProcedure

Debug DiffLevenshtein("examen", "exm2an")
Répondre