Accueil du site > Les articles > Recherche-Remplace en ADELIA
Version à imprimer Enregistrer au format PDF

Recherche-Remplace en ADELIA

vendredi 24 août 2007, par Serge Gomes Visites  987

MACRO ADELIA permettant d’effectuer des recheche/remplace de chaines de caractères.


Cette macro-instruction reçoit 3 paramètres =>

— Une chaine de caractère qui doit être déclarée en tant que variable caractère d’une longueur maxi de 9999.
— La chaine recherchée qui doit être définie dans une variable d’une longueur exactement égale à la chaine recherchée ou exprimée sous forme littérale.
— La chaine de remplacement qui doit être définie dans une variable d’une longueur exactement égale à la chaine recherchée ou exprimée sous forme littérale.

Exemple d’utilisation

Pour remplacer dans W_A9999 (une variable texte de 9999 de long) "Monsieur" par "M."

&RECHERCHE_REMPLACE(W_A9999;'Monsieur';'M.')

Code source

      
* ---------------------------------------------------------------- * 
* Serge GOMES  
* Attention :02 et :03 doivent être des variables alphanumériques    
* de longueur précise :                                              
* ex :02 = ’Mr’          devra être déclaré en 2A                    
*    :03 = ’Monsieur’    devra être déclaré en 8A                    
* OU des littéraux (’Mr’ ;’Monsieur’)                                 
*  :1     CHAINE  (MAXI 9999A)  Déclaration en tant que variable obligatoire 
*  :2     CHAINE RECHERCHÉE                                           
*  :3     CHAINE DE REMPLACEMENT                                     
* ---------------------------------------------------------------- * 
DECLARER_TAB MITXRS ;MI_WT_RESX  5 ;0 9999                             
DECLARER_TAB MI9999 ;MI_WT_9999  1   9999                             
DECLARER MIWRI ;MI_IND_RES 4 ;0                                        
DECLARER MIIXF ;MI_IND_FIN 4 ;0                                        
DECLARER MIX999 ;MI_X9999  9999                                       
DECLARER MIY999 ;MI_Y9999  9999                                       
DECLARER MIZ999 ;MI_Z9999  9999        
DECLARER MIXDEP ;MI_XDEP   4 ;0                                          
DECLARER MIXFIN ;MI_XFIN   4 ;0                                          
DECLARER MIXPOS ;MI_XPOS   4 ;0                                          
DECLARER MIXLNG ;MI_XLNG   4 ;0                                          
DECLARER MIWXB ;MI_BLKX    1                                            
DECLARER MIWXL1 ;MI_LNG_X1 4 ;0                                          
DECLARER MIWXL2 ;MI_LNG_X2 4 ;0                                          
DECLARER MIWXL3 ;MI_LNG_X3 4 ;0                                          
* Calcul longueur variable passée (pour :02 et :03)                    
MI_X9999   = ’#’ // :02 // ’#’                                         
MI_LNG_X2  = &LONGUEUR_CHAINE(MI_X9999)                                
MI_BLKX    = &EXTRACTION(MI_X9999 ;2;1)                                 
SI MI_BLKX  = ’’’’                                                     
  * La longueur varie selon que l’on passe une variable ou un littéral   
  MI_LNG_X2  = MI_LNG_X2 - 4                                           
SINON                                                                  
  MI_LNG_X2  = MI_LNG_X2 - 2                                           
FIN                                                    
MI_X9999   = *BLANK                                    
MI_X9999   = ’#’ // :03 // ’#’                         
MI_LNG_X3  = &LONGUEUR_CHAINE(MI_X9999)                
MI_BLKX    = &EXTRACTION(MI_X9999 ;2;1)                 
SI MI_BLKX = ’’’’                                      
  MI_LNG_X3  = MI_LNG_X3 - 4                           
SINON                                                  
  MI_LNG_X3  = MI_LNG_X3 - 2                           
FIN                                                    
MI_X9999   = *BLANK                                    
MI_Z9999   = *BLANK                                    
MI_Z9999   = :01                                       
MI_LNG_X1  = &LONGUEUR_CHAINE(MI_Z9999)                
* /fin calcul longueur                                                                                     
MI_IND_FIN = 1                                         
MI_IND_RES    = 1                                                
MI_XDEP = 1                                                      
MI_WT_RESX = &RECHERCHE(MI_Z9999 ;:02)                            
MI_XPOS = MI_WT_RESX(MI_IND_RES)                                 
TANT_QUE MI_XPOS > 0 ET MI_XPOS <= MI_LNG_X1                     
  MI_XLNG = MI_XPOS - MI_XDEP                                    
  MI_X9999   = *BLANK                                            
  MI_X9999   = &EXTRACTION(MI_Z9999 ;MI_XDEP ;MI_XLNG)             
  PLACER_TABLE MI_X9999 MI_WT_9999(MI_IND_FIN)                   
  MI_IND_FIN = MI_IND_FIN + MI_XLNG                              
  PLACER_TABLE :03 MI_WT_9999(MI_IND_FIN)                        
  MI_IND_FIN = MI_IND_FIN + MI_LNG_X3                            
  MI_XDEP = MI_XPOS + MI_LNG_X2                                  
  * Nécessaire pour le cas où on recherche de caractères doublés 
  * &RECHERCHE_REMPLACE(WVAR ;’AA’ ;’A’)                           
  TANT_QUE MI_XPOS < MI_XDEP ET MI_XPOS <> 0                     
    MI_IND_RES = MI_IND_RES + 1                                  
    MI_XPOS = MI_WT_RESX(MI_IND_RES)                           
  REFAIRE                                                      
REFAIRE                                                        
SI MI_IND_FIN > 0                                              
  * On ajoute le dernier fragment                              
  MI_XLNG = MI_LNG_X1 - MI_XDEP + 1                            
  MI_X9999   = *BLANK                                          
  MI_X9999   = &EXTRACTION(MI_Z9999 ;MI_XDEP ;MI_XLNG)           
  PLACER_TABLE MI_X9999 MI_WT_9999(MI_IND_FIN)                 
  MI_X9999 = *BLANK                                            
  PLACER_TABLE MI_WT_9999 MI_X9999                             
  :01 = MI_X9999                                               
FIN