Comparer et fusionner deux fichier texte...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Comparer et fusionner deux fichier texte...

Message par Lord Nelson »

Bonjour,

Je travail actuellement sur un projet de traduction, correction, etc. de fichier
Alors voila, j'ai deux fichier, un Anglais et un Français.

Alors pour me faciliter la tâche, je fais se programme qui va me mâcher le travail car comparer les deux fichier à la main et rajouter
se qui manque dans le fichier Français va prendre trop de temps surtout que ya beaucoup de fichier à faire !

Le but est de comparer le fichier Français avec celui Anglais
Tous se qui manquera dans le fichier Français serra ajouté depuis le fichier Anglais.

Pour corser le tous, le fichier Français devra être identique au fichier Anglais
dans tous les domaine sauf la traduction qui change, exactement la même
organisation, tous devra être parfaitement identique sauf la traduction bien sur.

Donc voilà comment je procède actuellement:

Je charge le fichier Anglais dans une liste
Je charge le fichier Français dans une liste

Je parcourt un par un depuis le début la liste Anglaise
Je parcourt en même temps un par un la liste Française

Ex:

Code : Tout sélectionner

ForEach ListeFichierAnglais.s()

  ForEach ListeFichierFrancais.s()

  Next

Next
Quand j'ai un élément (Clef) de la liste Anglaise, je le cherche dans la liste Française

La clef dans la liste Française est-elle présente:
Si oui -> est-elle à la bonne position, Si oui, je passe à l’élément suivant, Si non, je déplace l'élément de la liste Française et je le remet à la même position qu'il est dans la liste Anglaise
Si non -> Je copie l'élément de la liste Anglaise et je le met à la même position dans la liste Française (Évidement la traduction sera en anglais mais ont s'en fiche, suffira de traduire plus tard)

Comme si c'était simple, il faut aussi voir si ya des doublons (Toujours dans la liste Française car la liste Anglaise est toujours pas définition ni quel elle)
et si yen a, il faut les déplacer tout à la fin de la liste Française en mettant une séparation pour savoir ou il sont.

Bref un beau casse tête et j'ai un peu de mal donc si je pouvais avoir de l'aide se serait bien
J'ai déjà tous codé mais ça marche pas encore très très bien.

Le programme créer un fichier Français du résultat avec dans le nom de celui-ci "Traité"
Pas touche au originaux !

Je met le code ici mais je met aussi l'archive qui contient le code et les fichier de test
Si vous avez des questions ou autres chose hésitez pas :)

Code : Tout sélectionner

; Lecture et mise dans une liste le fichier de langue anglais.
FichierAnglais$ = OpenFileRequester("Sélectionnez le fichier ANGLAIS...", "", "Fichier Langue (.lang)|*.lang|All files (*.*)|*.*", 0)

If ReadFile(1, FichierAnglais$) ; Si le fichier peut être lu , on continue...
  
  NewList ListeFichierAnglais.s()
  
  While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File') 
    AddElement(ListeFichierAnglais.s())
    ListeFichierAnglais.s() = ReadString(1)
  Wend
  
  CloseFile(1)
  
Else ; Sinon ont affiche un message d'avertissement
  MessageRequester("Information","Impossible d'ouvrir le fichier !")
  
EndIf

; Lecture et mise dans une liste le fichier de langue français.
FichierFrancais$ = OpenFileRequester("Sélectionnez le fichier FRANCAIS...", "", "Fichier Langue (.lang)|*.lang|All files (*.*)|*.*", 0)

If ReadFile(1, FichierFrancais$) ; Si le fichier peut être lu , on continue...
  
  NewList ListeFichierFrancais.s()
  
  While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File')
    
    Ligne$ = ReadString(1)
    
    ; Ont ne prends pas les ligne vite, ont les ajoutera depuis la liste Anglaise, c'est pour évité les ligne vide superflue
    If Ligne$ > ""
      AddElement(ListeFichierFrancais.s())
      ListeFichierFrancais.s() = Ligne$
    EndIf
    
  Wend
  
  CloseFile(1)
  
Else ; Sinon ont affiche un message d'avertissement
  MessageRequester("Information","Impossible d'ouvrir le fichier !")
  
EndIf

IndexListeFichierAnglais = 0

; Parcourt la liste ListeFichierAnglais.s()
ForEach ListeFichierAnglais.s()
  
  IndexListeFichierAnglais + 1
  
  ; Recherche le "="
  PositionEgale = FindString(ListeFichierAnglais.s(), "=", 1)
  
  ; Si le "=" à bien été trouvé
  If PositionEgale > 0
    
    ; Extraction de la clef.
    ClefListeFichierAnglais$ = Mid(ListeFichierAnglais.s(), 1, PositionEgale)
    
    ; Ont prend l'élément pour un éventuel usage plus tard
    ElementListeAnglais$ = ListeFichierAnglais.s()
    
    Debug "Clef Anglaise actuel: " + ClefListeFichierAnglais$
    Debug "Position actuel de la clef Anglaise = " + ListIndex(ListeFichierAnglais.s())
    Debug ""
    
    ; Recherche de la clef semblable Anglaise dans la liste de langue français pour voir s'il elle éxiste bien
    Trouver = 0
    IndexListeFichierFrancais = 0
    
    ; Parcourt la liste ListeFichierFrancais.s()
    ForEach ListeFichierFrancais.s()
      
      ; La clef n'a pas encore été trouvé
      If Trouver = 0
        
        IndexListeFichierFrancais + 1
        
        ; Si la clef Anglaise à bien été trouvé dans la liste Française
        If FindString(ListeFichierFrancais.s(), ClefListeFichierAnglais$, 1)
          
          ; Ont prend l'élément pour un éventuel usage plus tard
          ElementListeFrancais$ = ListeFichierFrancais.s()
          
          Trouver = 1
          IndexListeFichierFrancais - 1 ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
          
          Continue
          
        EndIf
        
      ElseIf Trouver = 1 ; La clef à déjà été trouver
        
        ; Recherche des doublons...
        
        ; Si la clef Anglaise à encore été trouvé dans la liste Française
        If FindString(ListeFichierFrancais.s(), ClefListeFichierAnglais$, 1)
          
          Doublon + 1
          
          ; Ont met le doublon à la fin de la liste Française...
          
          ; Ont prend l'élément actuel de la liste Française
          ElementListeFrancaisTemps$ = ListeFichierFrancais.s()
          
          ; Ont sauvegarde la position actuel du pointeur dans la liste pour le restaurer plus tard
          SauvegardePositionPointeurListeFrancais = ListIndex(ListeFichierFrancais.s())
          
          ; Ont supprime cet élément
          DeleteElement(ListeFichierFrancais.s(), 1)
          
          ; Ont met l'élément à la fin de la liste de la liste Française
          LastElement(ListeFichierFrancais.s())
          AddElement(ListeFichierFrancais.s())
          ListeFichierFrancais.s() = ElementListeFrancaisTemps$
          
          ; Ont restaure l'élément courent de la liste Française
          SelectElement(ListeFichierFrancais.s(), SauvegardePositionPointeurListeFrancais)
          
        EndIf
        
      EndIf
      
    Next
    
    ; Ont vérifie que la clef à été trouvé
    If Trouver = 1
      
      Debug "Clef Française Trouvé !"
      Debug ""
      
      ; Ont va maintenant vérifier que les deux élément des deux liste sont à la même position
      
      ; Si l'élément dans la liste de la langue Française n'est pas à la même position que la liste de la langue Anglaise
      ; alors ont change de place l'élément la liste de la langue Française et ont le remet à la même position que la liste de la langue Anglaise
      
      ; Les deux élément sont t'il à la même position ?
      If IndexListeFichierAnglais - 1 = IndexListeFichierFrancais ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
                                                                      ; Oui, c'est bon !
        
        Debug "Clef Française a la bonne place"
        Debug ""
        
        Normale + 1
        
      Else ; L'élément de la liste de la langue Française n'est pas à la même position que la liste de la langue Anglaise 
        
        Debug "Clef Française à la mauvaise place !"
        Debug "La clef Anglaise est à la position " + Str(IndexListeFichierAnglais - 1) + ", Alors que la clef Française est à la position " + Str(IndexListeFichierFrancais) + " !"
        Debug ""
        
        ; Ont change l'élément actuel de position de la liste de la langue Française
        ; et ont le met à la même position que la liste de la langue Anglaise
        
        ; Supprime l'élément actuel de la liste de la langue Française
        DeleteElement(ListeFichierFrancais(), 1)
        
        ; Change le pointeur de place dans la liste ListeFichierFrancais.s() et le met à la même position que la liste ListeFichierAnglais.s()
        SelectElement(ListeFichierFrancais.s(), IndexListeFichierAnglais - 1) ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
        
        ; Ajoute l'élément dans la liste de la langue Française à la même position que la liste de la langue Anglaise
        AddElement(ListeFichierFrancais.s())
        ListeFichierFrancais.s() = ElementListeFrancais$
        
        Debug "La clef français a été changer de place -> " + Str(IndexListeFichierAnglais - 1)
        Debug ""
        
        Changer + 1
        
      EndIf
      
    Else ; La clef n'a pas été trouvé, il faut donc l'ajouter dans la liste de langue Française !
      
      Debug "Clef Anglaise " + Chr(34) + ElementListeAnglais$ + Chr(34) + " non trouvé dans la liste Française !"
      Debug "Clef Anglaise ajouté dans la liste Française a la position " + Str(IndexListeFichierAnglais - 1)
      Debug ""
      
      Entree + 1
      
      ; Ont rajoute la ligne entière ou se trouve la clef Anglaise dans la liste de la langue Française à la même position
      
      ; Change le pointeur de place dans la liste ListeFichierFrancais.s() et le met à la même position que la liste ListeFichierAnglais.s()
      SelectElement(ListeFichierFrancais.s(), IndexListeFichierAnglais - 1) ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
      
      ; Ajoute la ligne entière ou se trouve la clef Anglaise dans la liste de la langue Française
      AddElement(ListeFichierFrancais.s())
      ListeFichierFrancais.s() = ElementListeAnglais$
      
    EndIf
    
  Else ; La ligne ne contient pas de "="
    
    Debug "La ligne actuel n'est pas une clef"
    Debug ""
    
    ; Extraction de la ligne dans la liste de la langue anglais.
    LigneListeFichierAnglais$ = Mid(ListeFichierAnglais.s(), 1)
    
    Debug "La Ligne actuel est: " + LigneListeFichierAnglais$
    Debug ""
    
    ; Recherche de la ligne semblable Anglaise dans la liste de langue français pour voir s'il elle éxiste bien
    Trouver = 0
    IndexListeFichierFrancais = 0
    
    ; Parcourt la liste ListeFichierFrancais.s()
    ForEach ListeFichierFrancais.s()
      
      IndexListeFichierFrancais + 1
      
      ; Si la ligne Anglaise à bien été trouvé dans la liste Française
      If FindString(ListeFichierFrancais.s(), LigneListeFichierAnglais$, 1)
        
        ; Ont prend l'élément pour un éventuel usage plus tard
        ElementListeFrancais$ = ListeFichierFrancais.s()
        
        Trouver = 1
        IndexListeFichierFrancais - 1 ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
        
        Break ; Ont quitte la boucle car ont a trouvé la clef
        
      EndIf
      
    Next
    
    ; Ont vérifie que la ligne à été trouvé
    If Trouver = 1
      
      Debug "La ligne Anglaise " + Chr(34) + LigneListeFichierAnglais$ + Chr(34) + " a été trouvé dans la liste Française à la position " + Str(IndexListeFichierFrancais) 
      Debug ""
      
      ; Ont va maintenant vérifier que les deux élément des deux liste sont à la même position
      
      ; Si l'élément dans la liste de la langue Française n'est pas à la même position que la liste de la langue Anglaise
      ; alors ont change de place l'élément la liste de la langue Française et ont le remet à la même position que la liste de la langue Anglaise
      
      ; Les deux élément sont t'il à la même position ?
      If IndexListeFichierAnglais - 1 = IndexListeFichierFrancais ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
                                                                      ; Oui, c'est bon !
        
        Debug "La ligne Anglaise est à la bonne place dans la liste Française"
        Debug ""
        
        Normale + 1
        
      Else ; L'élément de la liste de la langue Française n'est pas à la même position que la liste de la langue Anglaise 
        
        Debug "La ligne Anglaise est à la mauvaise place dans la liste Française"
        Debug "Celle-ci est à la position " + Str(IndexListeFichierFrancais) + ", Alors qu'elle devrais plutôt être à la position " + Str(IndexListeFichierAnglais - 1)
        Debug ""
        
        ; Ont change l'élément actuel de position de la liste de la langue Française
        ; et ont le met à la même position que la liste de la langue Anglaise
        
        ; Supprime l'élément actuel de la liste de la langue Française
        DeleteElement(ListeFichierFrancais(), 1)
        
        ; Change le pointeur de place dans la liste ListeFichierFrancais.s() et le met à la même position que la liste ListeFichierAnglais.s()
        SelectElement(ListeFichierFrancais.s(), IndexListeFichierAnglais - 1) ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
        
        ; Ajoute l'élément dans la liste de la langue Française à la même position que la liste de la langue Anglaise
        AddElement(ListeFichierFrancais.s())
        ListeFichierFrancais.s() = LigneListeFichierAnglais$
        
        Debug "La ligne Française à été changé de place et mis à la position " + Str(IndexListeFichierAnglais - 1)
        Debug ""
        
        Changer + 1
        
      EndIf
      
    Else ; La ligne n'a pas été trouvé, il faut donc l'ajouter dans la liste de langue Française !
      
      Debug "La ligne Anglaise n'a pas été trouvé dans la liste Française"
      Debug "La ligne Anglaise " + Chr(34) + LigneListeFichierAnglais$ + Chr(34) + " a été ajouté dans la liste Française à la position " + Str(IndexListeFichierAnglais - 1)
      Debug ""
      
      Entree + 1
      
      ; Ont rajoute la ligne entière ou se trouve la clef Anglaise dans la liste de la langue Française à la même position
      
      ; Change le pointeur de place dans la liste ListeFichierFrancais.s() et le met à la même position que la liste ListeFichierAnglais.s()
      SelectElement(ListeFichierFrancais.s(), IndexListeFichierAnglais - 1) ; Il faut enlever 1 car au début ont à commencé à 1 alors que c'était 0 !
      
      ; Ajoute la ligne entière ou se trouve la clef Anglaise dans la liste de la langue Française
      AddElement(ListeFichierFrancais.s())
      ListeFichierFrancais.s() = LigneListeFichierAnglais$
      
    EndIf
    
  EndIf
  
Next

  Debug "------------------------------------------------------------------------------------------"
  Debug Str(Normale) + " Entrée Française était correcte."
  Debug Str(Changer) + " Entrée Française était présente mais à la mauvaise position et ont été changé de place."
  Debug Str(Entree) + " Entrée Française était manquante et ont été ajouté."
  Debug Str(Doublon) + " Entrée doublon Française ont été trouvé et déplacé en fin de liste."
  Debug "------------------------------------------------------------------------------------------"
  Debug ""
  
; Debug "Vérification des deux liste..."
; 
; ; Ont vérifie maintenant les deux liste pour voir s'il est sont concordante
; ; Parcourt tous les élément de la liste Anglaise
; ForEach ListeFichierAnglais.s()
;   
;   ; Met le pointeur de la liste Française à la même position que la liste Anglaise
;   SelectElement(ListeFichierFrancais.s(), ListIndex(ListeFichierAnglais.s())
;   
;   ; Récupère les élément de chacune des deux liste
;   ElementListeAnglais$ = ListeFichierAnglais.s()
;   ElementListeFrancais$ = ListeFichierFrancais.s()
;   
;   Debug "Element  Anglais = " + ElementListeAnglais$
;   Debug "Element Français = " + ElementListeFrancais$
;   
;   ; Les deux élément sont-il identique ?
;   If ElementListeAnglais$ = ElementListeFrancais$
;     Debug "Identique"
;     Debug ""
;     
;     Continue
;     
;   Else
;     Debug "Différent !"
;     Debug "Recherche de l'élément plus loin dans la liste..."
;     
;     ; Les deux élément sont différent, l'élément Français n'est pas à la bonne place, il manque peut être un élément
;     ; Recherche plus loin dans la liste Fraçaise pour voir si cet élément y est
;     
;   EndIf
;   
;   
;   
; Next
; 
; 
; 
; 
  
; Place le pointeur à la fin de la liste Anglaise
LastElement(ListeFichierAnglais.s())

; Place le pointeur de la liste Français à la même position que dans la liste Anglaise
SelectElement(ListeFichierFrancais.s(), ListSize(ListeFichierAnglais.s()) - 1) ; - 1 car la numérotaion des éléments de la liste commence à 0 et 0 est aussi un élément

; Ajoute une ligne en pointiller pour voir la séparation des doublons
AddElement(ListeFichierFrancais.s())
ListeFichierFrancais.s() = "-----------------------------------------------------------------------------------------------------------------------------------------------"

; ; Tous se qui se trouve en plus de la position de la liste Anglaise est Superflux !
; 
; For Index = ListSize(ListeFichierAnglais.s()) - 1 To ListSize(ListeFichierFrancais.s()) - 1
;   SelectElement(ListeFichierFrancais.s(), Index)
;   Debug "Superflux -> " + ListeFichierFrancais.s()
; Next
; 
; Debug "------------------------------------------------------------------------------------------"
; 
; ; Construction du fichier de verification de la langue Anglais
; CreateFile(1, GetFilePart(FichierAnglais$, #PB_FileSystem_NoExtension) + " Vérifier.lang")
; 
; ; Parcout tous les élément de la liste Anglaise et les enregistrent dans le nouveau fichier Anglais
; ForEach ListeFichierAnglais.s()
;   WriteStringN(1, ListeFichierAnglais.s())
; Next
; 
; CloseFile(1)
; 
; ; Construction du fichier de la langue Française
; CreateFile(1, GetFilePart(FichierFrancais$, #PB_FileSystem_NoExtension) + " Vérifier.lang")
; 
; ; Parcout tous les élément de la liste Française et les enregistrent dans le nouveau fichier Français
; ForEach ListeFichierFrancais.s()
;   WriteStringN(1, ListeFichierFrancais.s())
; Next
; 
; CloseFile(1)



; Construction du fichier de la langue français
CreateFile(1, GetFilePart(FichierFrancais$, #PB_FileSystem_NoExtension) + " Traité.lang")

; Parcout tous les élément de la liste Française et les enregistrent dans le nouveau fichier français
ForEach ListeFichierFrancais.s()
  WriteStringN(1, ListeFichierFrancais.s())
Next

Debug "Création du fichier terminé."

CloseFile(1)

Archive: http://www.aht.li/2573979/Test_X.7z
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Comparer et fusionner deux fichier texte...

Message par Marc56 »

Lord Nelson a écrit :Bonjour,

Je travaille actuellement sur un projet de traduction, correction, etc. de fichiers
Alors voila, j'ai deux fichiers, un Anglais et un Français.

Alors pour me faciliter la tâche, je fais ce programme qui va me mâcher le travail car comparer les deux fichiers à la main et rajouter
ce qui manque dans le fichier Français va prendre trop de temps surtout que il y a beaucoup de fichiers à faire !

Le but est de comparer le fichier Français avec celui Anglais
Tout ce qui manquera dans le fichier Français sera ajouté depuis le fichier Anglais.
[...]
Bonjour Lord Nelson,

Si c'est pour un exercice de style, c'est l'occasion de te servir des table de hachage (Maps)
http://www.purebasic.com/french/documen ... ewmap.html

Tu peux aussi te servir des fonctions de gestion des fichiers de préférences (les .prefs ou .ini)
http://www.purebasic.com/french/documen ... index.html
(Ça te gère en même temps les doublons)

Si c'est un besoin direct, il existe de nombreux programmes qui font ça, dont la plupart des éditeurs de texte, comme par exemple Notepad++ avec le plugin Compare.
http://notepad-plus-plus.org/fr/

Le plug se charge par le menu Complément > Plugin Managers > Show Plugin > Compare
Tu charges tes deux fichiers, puis CTRL+D
(il faut que les lignes de tes fichiers soient déjà triées par ordre alphanumérique. Si ça ne l'est pas, il y a aussi un plugin: TextFx)

Tu peux donc faire un système visuel presque identique en PB avec un ListIconGadget

:wink:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comparer et fusionner deux fichier texte...

Message par falsam »

Marc56 a écrit :c'est l'occasion de te servir des table de hachage (Maps)
Non pas dans son cas.

Une map ne restitue pas les éléments dans l'odre ou ils ont été mémorisés.

■ Exemple avec ce code

Code : Tout sélectionner

NewMap Country.s()
  
Country("GE") = "Germany"
Country("FR") = "France"
Country("UK") = "United Kingdom"
  
ForEach Country()
  Debug Country()
Next
■ Encore pire avec cette exemple ou je mémorise des items de 000 à 100

Code : Tout sélectionner

Structure sDummy
  item.s  
EndStructure

NewMap Dummy.sDummy()

For n = 0 To 100
  AddMapElement(Dummy(), Str(n))
  dummy()\item = "item " + LSet(Str(n), 3, "0")
Next

ForEach Dummy()
  Debug Dummy()\item
Next
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comparer et fusionner deux fichier texte...

Message par falsam »

Si je résume la problématique de Dayvid.

- Dayvid est branché sur l'API de stencyl et souhaite s'engager dans la traduction française.

- Nous avons deux fichiers de langues : Un en français (1071 lignes) et un en anglais (1381 lignes)

- Chaque ligne se présente de cette manière.

- Exemple pour chacun des fichiers.
   Français : sactor.setxy=définit %1 à %2 pour %0
   Anglais   : sactor.setxy=set %1 to %2 for %0

- Le point commun au deux fichier est le nom de la fonction API en rouge. La traduction pour chacun des deux fichiers est séparée de la fonction par le signe =.

- Le fichier anglais étant plus volumineux il apparait que certaines fonction API ne sont pas traduit en français.
- L'objectif du code qui va suivre est de fusionner ces deux fichiers afin de déterminer ce qui n'est pas traduit.

-Marc l'a suggéré, on va utiliser une map.
  La clé de chaque élément sera la fonction API.
  Pour chaque clé, on ajoutera la traduction anglaise et française (si il y a)

Afin de conservé l'ordre de lecture des deux fichiers, on va aussi associé une liste chaînée à cette map.
Chaque élément de la map sera un pointeur vers un élément de la liste chaînée.

Le code.

Code : Tout sélectionner

EnableExplicit

Structure sActor
  key.s
  fr.s
  en.s
EndStructure

Global NewList Actor.sActor()
Global NewMap *Actor.sActor()

Procedure ActorUpdate(Key.s, Value.s, Language.s)
  If Not FindMapElement(*Actor(), Key)
    AddMapElement(*Actor(), Key)
    *Actor() = AddElement(Actor())
  EndIf 
  
  *Actor()\key = key
  
  If Language = "en"
    *Actor()\en = Value  
  Else
    *Actor()\fr = Value
  EndIf
EndProcedure

Procedure ReadTextFile(FileName.s, Type.s)
  Protected Buffer.s, Key.s, Value.s
  
  If ReadFile(0, FileName)
    While Eof(0) = 0
      Buffer  = ""
      
      Buffer  = ReadString(0)
      Key     = StringField(Buffer, 1, "=")
      Value   = StringField(Buffer, 2, "=")   
      
      ActorUpdate(Key, Value, Type)
    Wend
    CloseFile(0)
  EndIf
EndProcedure

Procedure Control()
  OpenWindow(0, 0, 0, 800, 600, "Control", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ListIconGadget(0, 10, 10, 780, 580, "Clé", 200)
  AddGadgetColumn(0, 1, "Français", 200)
  AddGadgetColumn(0, 2, "Anglais", 200)
  
  ForEach(Actor())
    With Actor()
      AddGadgetItem(0, -1, \key + Chr(10) + \fr +  Chr(10) + \en)
    EndWith
  Next
  
  Repeat : Until WaitWindowEvent(10) = #PB_Event_CloseWindow
EndProcedure

;-Start
ReadTextFile("Anglais.txt", "en")
ReadTextFile("Français.txt", "fr")
Control()
Dayvid ce n'est pas trés compliqué de coder la suite du programme pour éditer chacune des lignes de ce tableau et ajouter les traductions manquantes.
Dernière modification par falsam le sam. 31/janv./2015 12:25, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comparer et fusionner deux fichier texte...

Message par Lord Nelson »

Bonjour,

Je vous remercies de votre aide à tous les deux.
@Falsam, tu as tous compris c'est bien ça :)

Tu vois se qui manquera dans le fichier Français serra ajouté depuis le fichier Anglais en respectant scrupuleusement l'ordre d’apparitions
des éléments, se qui ne serra pas à la bonne place sera changé de place et remis à la bonne place.

- Exemple pour chacun des fichiers: Vert = Bonne place, Bleu = présent mais n'était pas à la bonne place, Violet = Rajouté

Français Originale:
sactor.setxy=Définir %1 à %2 Pour %0
sactor.sety=Définir Y à %1 Pour %0
sactor.rotate=Tourne [i:rot-cw] %0 De %1 Degrés
sactor.setx=Définir X à %1 Pour %0
sactor.setangle=Angle %0 Orienté à %1 Degrés
sactor.rotate2=Tourne [i:rot-ccw] %0 De %1 Degrés


Français Retravaillé (Si j'me suis pas planté):
# Actor Setters
sactor.setxy=Définir %1 à %2 Pour %0
sactor.setx=Définir X à %1 Pour %0
sactor.sety=Définir Y à %1 Pour %0
sactor.setangle=Angle %0 Orienté à %1 Degrés
sactor.rotate=Tourne [i:rot-cw] %0 De %1 Degrés
sactor.rotate2=Tourne [i:rot-ccw] %0 De %1 Degrés
sactor.setdxy=set %1 to %2 for %0
sactor.setdx=set x-speed to %1 for %0
sactor.setdy=set y-speed to %1 for %0



Anglais (Par définition toujours ni quel):
# Actor Setters
sactor.setxy=set %1 to %2 for %0
sactor.setx=set x to %1 for %0
sactor.sety=set y to %1 for %0
sactor.setangle=point %0 towards %1 degrees
sactor.rotate=turn [i:rot-cw] %0 by %1 degrees
sactor.rotate2=turn [i:rot-ccw] %0 by %1 degrees
sactor.setdxy=set %1 to %2 for %0
sactor.setdx=set x-speed to %1 for %0
sactor.setdy=set y-speed to %1 for %0


Voila, le fichier Français doit parfaitement coller à l'identique avec le fichier Anglais, les élément doivent être exactement à la même place.
La seule chose qui changera, se serra les traduction non faite si ont doit ajouter des éléments depuis le fichier Anglais vers le fichier Français.

Je pensais cet exercice pas si compliqué que ça et quand je le fais dans ma tête c'est facile
mais une fois dans le code, et bien je peux vous dire que pour moi c'est pas la même chose !
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comparer et fusionner deux fichier texte...

Message par falsam »

Lord Nelson a écrit :Tu vois se qui manquera dans le fichier Français serra ajouté depuis le fichier Anglais en respectant scrupuleusement l'ordre d’apparitions
des éléments, se qui ne serra pas à la bonne place sera changé de place et remis à la bonne place.
Il faut commencé par lire le fichier anglais. j'ai fait le contraire dans mon code.

Code précédent corrigé.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Comparer et fusionner deux fichier texte...

Message par Lord Nelson »

Oui l'anglais est la cible toujours :)
Merci Falsam :)

J'ai tous recommencé depuis le début car ça fonctionnait pas, j'ai utilisé d'autres méthodes mais pas de Map du coup car ça m’handicapais pas mal.
C'est je crois au point d'après se que j'ai pue voir, l'archive contient se qu'il faut pour tester.

Code : Tout sélectionner

; Code réalisé par Monsieur Dieppedalle David le 02/02/2015.

; Lecture et mise dans un tableau le fichier de langue Anglaise.
FichierAnglais$ = OpenFileRequester("Sélectionnez le fichier ANGLAIS...", "", "Fichier Langue (.lang)|*lang|Tous les fichiers (*.*)|*.*", 0)

If ReadFile(1, FichierAnglais$) ; Si le fichier peut être lu , on continue...
  
  PositionFichierAnglais = 0
  ElementTotaleTableauFichierAnglais = 1
  
  ; Création d'un tableau pour y mettre les clefs ainsi que les valeurs du fichier Anglais.
  Dim TableauFichierAnglais.s(1, PositionFichierAnglais)
  
  While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File').
    
    ; Lecture de la ligne dans le fichier Anglais.
    LigneFichierAnglais$ = ReadString(1)
    
    ; Si la ligne est vide, ont l'igniore simplement, ont ne la prend pas.
    If LigneFichierAnglais$ = ""
      ; Ont continue et ont va à la prochaine ligne dans le fichier Anglais.
      LigneVideFichierAnglais + 1
      Continue
    EndIf
    
    ; Ont augmente la taille du tableau Anglais de +1 si l'index de la boucle (PositionFichierAnglais) est supérieur au nombre d'élément dans le tableau Anglais.
    If PositionFichierAnglais > ArraySize(TableauFichierAnglais.s(), 2)
      ReDim TableauFichierAnglais.s(1, PositionFichierAnglais)
      ElementTotaleTableauFichierAnglais + 1
    EndIf
    
    ; Recherche le "="
    PositionEgale = FindString(LigneFichierAnglais$, "=", 1)
    
    ; Si le "=" à bien été trouvé.
    If PositionEgale > 0
      
      ; Extraction de la clef et de la valeur dans la variable LigneFichierAnglais$.
      ClefListeFichierAnglais$ = Mid(LigneFichierAnglais$, 1, PositionEgale)
      ValeurListeFichierAnglais$ = Mid(LigneFichierAnglais$, PositionEgale + 1)
      
      ; Ont insert la clef et la valeur dans le tableau Anglais.
      TableauFichierAnglais.s(0, PositionFichierAnglais) = ClefListeFichierAnglais$
      TableauFichierAnglais.s(1, PositionFichierAnglais) = ValeurListeFichierAnglais$
      
    Else ; La ligne ne contient pas de "=".
      
      ; Ont insert la clef et une valeur vide dans le tableau Anglais.
      TableauFichierAnglais.s(0, PositionFichierAnglais) = LigneFichierAnglais$
      TableauFichierAnglais.s(1, PositionFichierAnglais) = ""
      
    EndIf
    
    PositionFichierAnglais + 1
    
  Wend
  
  CloseFile(1)
  
Else ; Sinon ont affiche un message d'avertissement.
  MessageRequester("Information","Impossible d'ouvrir le fichier !")
  
EndIf


; Lecture et mise dans un tableau le fichier de langue Française.
FichierFrancais$ = OpenFileRequester("Sélectionnez le fichier FRANÇAIS...", "", "Fichier Langue (.lang)|*lang|Tous les fichiers (*.*)|*.*", 0)

If ReadFile(1, FichierFrancais$) ; Si le fichier peut être lu , on continue...
  
  PositionFichierFrancais = 0
  ElementTotaleTableauFichierFrancais = 1
  
  ; Création d'un tableau pour y mettre les clefs ainsi que les valeurs du fichier Anglais.
  Dim TableauFichierFrancais.s(1, PositionFichierFrancais)

  While Eof(1) = 0 ; Boucle tant que la fin du fichier n'est pas atteinte. (Eof = 'End Of File').
    
    ; Lecture de la ligne dans le fichier Français.
    LigneFichierFrancais$ = ReadString(1)
    
    ; Si la ligne est vide, ont l'igniore simplement, ont ne la prend pas.
    If LigneFichierFrancais$ = ""
      ; Ont continue et ont va à la prochaine ligne dans le fichier Français.
      LigneVideFichierFrancais + 1
      Continue
    EndIf
    
    ; Ont augmente la taille du tableau Français de +1 si l'index de la boucle (PositionFichierFrancais) est supérieur au nombre d'élément dans le tableau Français.
    If PositionFichierFrancais > ArraySize(TableauFichierFrancais.s(), 2)
      ReDim TableauFichierFrancais.s(1, PositionFichierFrancais)
      ElementTotaleTableauFichierFrancais + 1
    EndIf
    
    ; Recherche le "="
    PositionEgale = FindString(LigneFichierFrancais$, "=", 1)
    
    ; Si le "=" à bien été trouvé.
    If PositionEgale > 0
      
      ; Extraction de la clef et de la valeur dans la variable LigneFichierFrancais$.
      ClefListeFichierFrancais$ = Mid(LigneFichierFrancais$, 1, PositionEgale)
      ValeurListeFichierFrancais$ = Mid(LigneFichierFrancais$, PositionEgale + 1)
      
      ; Ont insert la clef et la valeur dans le tableau Français.
      TableauFichierFrancais.s(0, PositionFichierFrancais) = ClefListeFichierFrancais$
      TableauFichierFrancais.s(1, PositionFichierFrancais) = ValeurListeFichierFrancais$
      
    Else ; La ligne ne contient pas de "="
      
      ; Ont insert la clef et une valeur vide dans le tableau Français.
      TableauFichierFrancais.s(0, PositionFichierFrancais) = LigneFichierFrancais$
      TableauFichierFrancais.s(1, PositionFichierFrancais) = ""
      
    EndIf
    
    PositionFichierFrancais + 1
    
  Wend
  
  CloseFile(1)
  
Else ; Sinon ont affiche un message d'avertissement.
  MessageRequester("Information","Impossible d'ouvrir le fichier !")
  
EndIf

; Création d'une liste qui contiendra le fichier Français de sortie.
NewList ListeFichierFrancaisSortie.s()

; Parce que le fichier Anglais à une ligne vide au début de celui-ci, donc ont la reproduit dans
; le fichier Français de sortie de sorte que les deux fichiers soit strictement identique.
AddElement(ListeFichierFrancaisSortie.s())
ListeFichierFrancaisSortie.s() = ""

; Création d'une liste qui contiendra les doublons.
NewList ListeDoublons.s()

; Parcourt du tableau TableauFichierAnglais.s().
For PositionFichierAnglais = 0 To ArraySize(TableauFichierAnglais.s(), 2)
  
  ; Copie de la clef et de la valeur du tableau TableauFichierAnglais.s() dans les variables respectives.
  ClefTableauFichierAnglais$ = TableauFichierAnglais.s(0, PositionFichierAnglais)
  ValeurTableauAnglais$ = TableauFichierAnglais.s(1, PositionFichierAnglais)
  
  Trouver = 0
  Correcte = 0
  
  ; Parcourt du tableau TableauFichierFrancais.s().
  For PositionFichierFrancais = 0 To ArraySize(TableauFichierFrancais.s(), 2)
    
    ; Copie de la clef et de la valeur du tableau PositionFichierFrancais.s() dans les variables respectives.
    ClefTableauFichierFrancais$ = TableauFichierFrancais.s(0, PositionFichierFrancais)
    ValeurTableauFrancais$ = TableauFichierFrancais.s(1, PositionFichierFrancais)
    
    ; Y a t-il au moins une clef dans le tableau TableauFichierFrancais.s() ?
    If ClefTableauFichierFrancais$ > ""
      
      ; La clef du tableau TableauFichierFrancais.s() est t-elle la même que le tableau TableauFichierAnglais.s() ?
      If ClefTableauFichierFrancais$ = ClefTableauFichierAnglais$ ; Oui, même clef.
        Trouver = 1
        
        ; La position des deux élément est-elle la même dans les deux tableau ?
        If PositionFichierFrancais = PositionFichierAnglais ; Oui, même position.
          Correcte = 1
          
          ; Ont copie l'élément du tableau Français "TableauFichierFrancais.s()" puis ont le met dans la liste "ListeFichierFrancaisSortie.s()".
          AddElement(ListeFichierFrancaisSortie.s())
          ListeFichierFrancaisSortie.s() = ClefTableauFichierFrancais$ + ValeurTableauFrancais$
          
          ; Puis, ont supprimer la clef ainsi que la valeur dans la tableau Français "TableauFichierFrancais.s()" car il viennent d'être traité.
          
          ; Suppression de la clef.
          TableauFichierFrancais.s(0, PositionFichierFrancais) = ""
          
          ; Suppression de la valeur.
          TableauFichierFrancais.s(1, PositionFichierFrancais) = ""
          
          ; Ont comptabilises le nombre d'élément correcte.
          ElementCorrecte + 1
          
          ; Ont continue et ont va à la prochaine itération de la boucle du tableau TableauFichierFrancais.s()
          Continue
          
        Else ; La position des deux élément est différente dans les deux tableau.
          
          ; L'élément a t-il déjà été trouvé ?
          If Correcte = 1 ; Oui, c'est donc un doublon !
            
            ; Ont prend l'élément et ont le supprime du tableau pour le mettre dans une liste à part qui contient les doublons.
            
            ; Suppression de la clef.
            TableauFichierFrancais.s(0, PositionFichierFrancais) = ""
            
            ; Suppression de la valeur.
            TableauFichierFrancais.s(1, PositionFichierFrancais) = ""
            
            ; Ajoute le doublon dans la liste de doublon.
            AddElement(ListeDoublons.s())
            ListeDoublons.s() = ClefTableauFichierFrancais$ + ValeurTableauFrancais$
            
            ; Ont comptabilises le nombre de doublon trouvé
            DoublonTrouver + 1
            
            ; Ont continue et ont va à la prochaine itération de la boucle du tableau TableauFichierFrancais.s()
            Continue
            
          ElseIf Correcte = 0 ; Non, donc l'élément est bien dans le fichier mais pas à la bonne place, ont va le remettre à la bonne place.
            
            ; Ont prend l'élément et ont le supprime du tableau pour le mettre dans la liste ListeFichierFrancaisSortie.s().
            
            ; Suppression de la clef.
            TableauFichierFrancais.s(0, PositionFichierFrancais) = ""
            
            ; Suppression de la valeur.
            TableauFichierFrancais.s(1, PositionFichierFrancais) = ""
            
            ; Ajoute l'élément dans la liste ListeFichierFrancaisSortie.s().
            AddElement(ListeFichierFrancaisSortie.s())
            ListeFichierFrancaisSortie.s() = ClefTableauFichierFrancais$ + ValeurTableauFrancais$
            
            Correcte = 1
            
            ; Ont comptabilises le nombre d'élément trouvé mais à la mauvaise place.
            ElementMauvaisePlace + 1
            
            ; Ont continue et ont va à la prochaine itération de la boucle du tableau TableauFichierFrancais.s()
            Continue
            
          EndIf
          
        EndIf
        
      Else ; La clef du tableau TableauFichierFrancais.s() est différente du tableau TableauFichierAnglais.s().
           ; Ont ignore cet élément pour le moment, ont y reviendra plus tard quand ont rencontrera cet élément dans le tableau TableauFichierAnglais.s().
        
        ; Ont continue et ont va à la prochaine itération de la boucle du tableau TableauFichierFrancais.s()
        Continue
        
      EndIf
      
    Else ; Le tableau TableauFichierFrancais.s() ne contient pas de clef, c'est une ligne vide.
         ; Ont ignore cet élément, il a déjà été traité plus haut ou alors il n'y avait rien.
      
      ; Ont continue et ont va à la prochaine itération de la boucle du tableau TableauFichierFrancais.s()
      Continue
      
    EndIf
    
  Next
  
  ; Nous somme à la fin du tableau TableauFichierFrancais.s().
  
  ; Si la clef Anglaise n'a pas été trouvé dans le fichier Français.
  If Trouver = 0 ; Ont n'as pas trouvé la clef Anglaise  dans le fichier Français, donc cet élément est manquant dans le fichier Français, ont va le rajouté à la même position qu'il est dans le fichier Anglais.
    
    ; Ajoute l'élément dans la liste ListeFichierFrancaisSortie.s().
    AddElement(ListeFichierFrancaisSortie.s())
    ListeFichierFrancaisSortie.s() = ClefTableauFichierAnglais$ + ValeurTableauAnglais$
    
    ; Ont comptabilises le nombre d'élément ajouté.
    ElementAjouter + 1
    
  EndIf
  
Next

; Création du fichier de sortie Français.
CreateFile(1, GetFilePart(FichierFrancais$, #PB_FileSystem_NoExtension) + " Traité.lang")

; Parcourt de la liste pour récupérer puis écrire chaque élément dans le fichier de sortie Français.
ForEach ListeFichierFrancaisSortie.s()
  
  ; Si l'index actuel de la boucle est plus petit que nombre d'élément -1 dans la liste ListeFichierFrancaisSortie.s().
  If Index < ListSize(ListeFichierFrancaisSortie.s()) - 1
    ; Écriture de l'élément de la liste ListeFichierFrancaisSortie.s() dans le fichier de sortie Français.
    WriteStringN(1, ListeFichierFrancaisSortie.s())
  Else
    ; Écriture de l'élément de la liste ListeFichierFrancaisSortie.s() dans le fichier de sortie Français.
    WriteString(1, ListeFichierFrancaisSortie.s()) ; Pour ne pas écrire une nouvelle ligne à la fin du fichier.
  EndIf
  
  Index + 1
  
Next

CloseFile(1) ; Fermeture du fichier de sortie Français.

; Création du fichier de sortie des doublons Français.
CreateFile(1, GetFilePart(FichierFrancais$, #PB_FileSystem_NoExtension) + " Doublons.txt")

; Parcourt de la liste pour récupérer puis écrire chaque élément dans le fichier de sortie des doublons Français.
ForEach ListeDoublons.s()
  ; Ecriture de l'élément de la liste ListeDoublons.s() dans le fichier de sortie des doublons Français.
  WriteStringN(1, ListeDoublons.s())
Next

CloseFile(1) ; Fermeture du fichier de sortie des doublons Français.

; Création du fichier de sortie des restes du fichier Français.
CreateFile(1, GetFilePart(FichierFrancais$, #PB_FileSystem_NoExtension) + " Reste.txt")

; Parcour du tableau Français pour récupérer puis écrire chaque élément dans le fichier de sortie des restes du fichier Français.
For PositionFichierFrancais = 0 To ArraySize(TableauFichierFrancais.s(), 2)
  
  ; Si un des élément du tableau TableauFichierFrancais.s() n'est pas vide.
  If TableauFichierFrancais.s(0, PositionFichierFrancais) > "" Or TableauFichierFrancais.s(1, PositionFichierFrancais) > ""
    ; Ont comptabilise le nombre d'élément qu'il reste, qui n'ont pas pu être traité.
    ElementRestant + 1
  EndIf
  
  ; Écriture des l’élément du tableau TableauFichierFrancais.s() dans le fichier de sortie des restes du fichier Français.
  WriteString(1, TableauFichierFrancais.s(0, PositionFichierFrancais))
  WriteStringN(1, TableauFichierFrancais.s(1, PositionFichierFrancais))
  
Next

CloseFile(1) ; Fermeture du fichier de sortie des restes du fichier Français.

; Création du fichier de débogage de sortie du fichier Français.
CreateFile(1, GetFilePart(FichierFrancais$, #PB_FileSystem_NoExtension) + " Debug.txt")

; Ecriture des informations de débogage dans le fichier de débogage de sortie du fichier Français.
WriteStringN(1, "Nombre d'éléments à la bonne place dans le fichier Français = " + Str(ElementCorrecte))
WriteStringN(1, "Nombre d'élément manquant et rajouté dans le fichier Français = " + Str(ElementAjouter))
WriteStringN(1, "Nombre d'élément trouvé mais à la mauvaise place dans le fichier Français = " + Str(ElementMauvaisePlace))
WriteStringN(1, "Nombre d'élément en doublons dans le fichier Français = " + Str(DoublonTrouver))
WriteStringN(1, "Nombre d'élément totale dans le fichier Anglais originale = " + Str(ElementTotaleTableauFichierAnglais))
WriteStringN(1, "Nombre d'élément totale dans le fichier Français avant opération = " + Str(ElementTotaleTableauFichierFrancais))
WriteStringN(1, "Nombre d'élément totale dans le fichier Français après opération = " + Str(ListSize(ListeFichierFrancaisSortie.s()) - 1)) ; -1 car ont à ajouté une ligne vide au début de la liste pour être identique au fichier Anglais.
WriteStringN(1, "Élément restant non trouvé dans le fichier Anglais mais présent dans le fichier Français = " + Str(ElementRestant))

CloseFile(1) ; Fermeture du fichier de débogage de sortie du fichier Français.
http://www.aht.li/2573979/Test_X.7z
Répondre