Recherche…


Introduction

Dans Progress ABL, il existe deux types de chaînes, celles définies comme CHARACTER et celles définies comme LONGCHAR . Un fichier de plus de 32K de longueur est un LONGCHAR . La plupart des chaînes sont à moins d'indication contraire de la casse.

Remarques

Rappelez-vous - toutes les positions commencent par la position 1!

Définir, associer et afficher une chaîne

En général, vous devez toujours définir toutes les variables et tous les paramètres comme NO-UNDO sauf si vous en avez vraiment besoin.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

DISPLAY cString.

Chaînes concaténantes

En utilisant l'opérateur + , vous pouvez facilement concaténer deux chaînes ou plus.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

cString = cString + " " + "GOODBYE".

DISPLAY cString FORMAT "X(20)".

Manipulation de cordes

Il existe deux fonctions intégrées utiles pour travailler avec des chaînes. Toutes les fonctions fonctionnant avec la position des caractères commencent par l'index 1 en tant que premier caractère, et non 0, ce qui est courant dans de nombreuses langues.

STRING - convertit toute valeur en chaîne

Cet exemple convertit le nombre entier 2000 en chaîne "2000".

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

i = 2000.

c = STRING(i).

DISPLAY c.

CHR et ASC - convertit les caractères uniques en ascii.

CHR (entier)

Renvoie la représentation des caractères pour un entier de code ascii

ASC (caractère)

Renvoie la valeur entière ascii du caractère

DEFINE VARIABLE ix     AS INTEGER   NO-UNDO.
DEFINE VARIABLE letter AS CHARACTER NO-UNDO FORMAT "X(1)" EXTENT 26.

DO ix = 1 TO 26:
  letter[ix] = CHR((ASC("A")) - 1 + ix).
END.

DISPLAY SKIP(1) letter WITH 2 COLUMNS NO-LABELS
  TITLE "T H E  A L P H A B E T".

LONGUEUR - renvoie la longueur d'une chaîne

LONGUEUR (chaîne). // Retourne un entier avec la longueur de la chaîne.

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "HELLO".

MESSAGE "The string " cString " is " LENGTH(cString) " characters long" VIEW-AS ALERT-BOX. 

SUBSTRING - retourne ou assigne une partie d'une chaîne

  • SUBSTRING (chaîne, position de départ, longueur).

Renvoie les caractères "length" à partir de "string" à partir de la position "start-position".

  • SUBSTRING (chaîne, position de départ).

Renvoie le reste de "string", en commençant à la position "start-position"

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".

DISPLAY SUBSTRING(cString, 4, 2). //Displays "DE" 
DISPLAY SUBSTRING(cString, 4). //Displays "DEFGH"

La sous-chaîne peut également être utilisée pour écraser une partie d'une chaîne. Utilisez la même syntaxe, mais affectez cette sous-chaîne à la place:

DEFINE VARIABLE cString AS CHARACTER   NO-UNDO.

cString = "ABCDEFGH".
 
SUBSTRING(cString, 4, 2) = "XY". //Replaces position 4 and 5 with "XY" 

DISPLAY cString.  

Il existe également une fonction similaire appelée OVERLAY Cet exemple de la documentation Progress couvre les différences entre OVERLAY et SUBSTRING :

/* This procedure illustrates the differences between the SUBSTRING and
   OVERLAY statements. */
DEFINE VARIABLE cOriginal  AS CHARACTER NO-UNDO INITIAL "OpenEdge".
DEFINE VARIABLE cSubstring AS CHARACTER NO-UNDO.
DEFINE VARIABLE cOverlay   AS CHARACTER NO-UNDO.
DEFINE VARIABLE cResults   AS CHARACTER NO-UNDO.

/* Default behavior without optional LENGTH. */
ASSIGN
 cSubstring              = cOriginal
 SUBSTRING(cSubstring,2) = "***"
 cOverlay                = cOriginal
 OVERLAY(cOverlay,2)     = "***"
 cResults                = "target = ~"OpenEdge~". ~n~n" 
  + "If you do not supply a length, SUBSTRING and OVERLAY default as follows:
  ~n~n" + "SUBSTRING(target,2) = ~"***~"  yields:  " + cSubstring + ". ~n" 
  + "OVERLAY(target,2)     = ~"***~"  yields:  " + cOverlay + ".".

/* Behavior with zero LENGTH. */
ASSIGN
 cSubstring                = cOriginal
 SUBSTRING(cSubstring,2,0) = "***"
 cOverlay                  = cOriginal
 OVERLAY(cOverlay,2,0)     = "***"
 cResults                  = cResults + "~n~n" 
  + "For a zero length, SUBSTRING and OVERLAY behave as follows:  ~n~n" 
  + "SUBSTRING(target,2,0) = ~"***~"  yields:  " + cSubstring + ". ~n" 
  + "OVERLAY(target,2,0)     = ~"***~"  yields:  " + cOverlay + ".".

/* Behavior with LENGTH < replacement. */
ASSIGN 
 cSubstring                = cOriginal
 SUBSTRING(cSubstring,2,1) = "***"
 cOverlay                  = cOriginal
 OVERLAY(cOverlay,2,1)     = "***"
 cResults                  = cResults + "~n~n" 
  + "For a length shorter than the replacement, SUBSTRING and OVERLAY behave
  as follows: ~n~n" + "SUBSTRING(target,2,1) = ~"***~"  yields:  " 
  + cSubstring + ". ~n" + "OVERLAY(target,2,1)     = ~"***~"  yields:  " 
  + cOverlay + ".".

/* Behavior with LENGTH = replacement. */
ASSIGN 
 cSubstring                = cOriginal
 SUBSTRING(cSubstring,2,3) = "***"
 cOverlay                  = cOriginal
 OVERLAY(cOverlay,2,3)     = "***"
 cResults                  = cResults + "~n~n" 
  + "For a length equal to the replacement, SUBSTRING and OVERLAY behave as
  follows:  ~n~n" + "SUBSTRING(target,2,3) = ~"***~"  yields:  " 
  + cSubstring + ". ~n" + "OVERLAY(target,2,3)     = ~"***~"  yields:  " 
  + cOverlay + ".".

/* Behavior with LENGTH > replacement. */
ASSIGN 
 cSubstring                = cOriginal
 SUBSTRING(cSubstring,2,6) = "***"
 cOverlay                  = cOriginal
 OVERLAY(cOverlay,2,6)     = "***"
 cResults                  = cResults + "~n~n" 
  + "For a length greater than the replacement, SUBSTRING and OVERLAY behave
  as follows:  ~n~n" + "SUBSTRING(target,2,6) = ~"***~"  yields:  " 
  + cSubstring + ". ~n" + "OVERLAY(target,2,6)     = ~"***~"  yields:  " 
  + cOverlay + ".".

MESSAGE cResults VIEW-AS ALERT-BOX.

INDEX - renvoie la position d'une chaîne dans une chaîne.

R-INDEX va à la même chose mais chercher de droite à gauche.

INDEX (source, cible)

Recherchez la cible dans la source (de gauche à droite) et retournez sa position. S'il manque le résultat 0.

INDEX (source, cible, position de départ).

Comme ci-dessus, mais commencez à chercher au départ

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.

str = "ABCDEFGH".

DISPLAY INDEX(str, "cd") INDEX(str, "cd", 4). //Will display 3 and 0

REPLACE - remplace une chaîne dans une chaîne.

REPLACE (chaîne, from-string, to-string)

Remplace de string par to-string dans string. From-string et to-string n'ont pas besoin d'avoir la même longueur, to-string peut aussi ne rien avoir ("") pour supprimer un caractère.

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

c = "ELLO".

DISPLAY REPLACE(c, "E", "HE"). // Displays "HELLO"

c = "ABABABA".

DISPLAY REPLACE(c, "B", ""). // Remove all Bs

TRIM - supprime les espaces de début et de fin (ou autres caractères).

Cela peut être utile pour nettoyer l'indata.

TRIM (chaîne)

Supprime tous les espaces de début et de fin, les tabulations, les sauts de ligne et les retours chariot.

TRIM (chaîne, caractère).

Supprime tous les "caractères" de début et de fin.

LEFT-TRIM et RIGHT-TRIM font la même chose mais ne font que conduire ou suivre.

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

c = "__HELLO_WORLD_____".

DISPLAY TRIM(c, "_").
/*Displays HELLO_WORLD without all the leading and 
trailing underscores but leaves the one in the middle.
REPLACE would have removed that one as well */

SUBSTITUTE - remplace les paramètres dans une chaîne.

SUBSTITUTE is a limited function for replacing up to nine preformatted parameters in a string.

SUBSTITUTE (chaîne, param1, param2, ..., param9).

Les paramètres doivent être au format &1 à &9 .

Si vous voulez utiliser une esperluette dans la chaîne (et ne pas l'utiliser comme paramètre), écartez-la avec une autre perluète: && .

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.
                                      
str = "&1 made &2 goals in &3 games playing for &4".

MESSAGE SUBSTITUTE(str, "Zlatan Ibrahimovic", 113, 122, "Paris Saint-Germain") VIEW-AS ALERT-BOX.
MESSAGE SUBSTITUTE(str, "Mats Sundin", 555, 1305, "Toronto Maple Leafs") VIEW-AS ALERT-BOX.

Un paramètre peut apparaître plus d'une fois dans une chaîne, tous seront remplacés:

MESSAGE SUBSTITUTE("&1 &2 or not &1 &2", "To", "Be") VIEW-AS ALERT-BOX.

Cordes SENSIBLES

Toutes les chaînes dans Progress ABL sont sensibles à la casse, sauf indication contraire.

Cet exemple affiche une boîte de message indiquant que les chaînes sont identiques.

DEFINE VARIABLE str1 AS CHARACTER   NO-UNDO.
DEFINE VARIABLE str2 AS CHARACTER   NO-UNDO.

str1 = "abc".
str2 = "ABC".

IF str1 = str2 THEN 
    MESSAGE "The strings are identical" VIEW-AS ALERT-BOX.

Pour déclarer une chaîne sensible à la casse, ajoutez simplement l'attribut CASE-SENSITIVE

DEFINE VARIABLE str1 AS CHARACTER   NO-UNDO CASE-SENSITIVE.
DEFINE VARIABLE str2 AS CHARACTER   NO-UNDO.

str1 = "abc".
str2 = "ABC".

IF str1 = str2 THEN 
    MESSAGE "The strings are identical" VIEW-AS ALERT-BOX.
ELSE 
    MESSAGE "There's a difference" VIEW-AS ALERT-BOX.

(Il suffit que l'une des chaînes l'a dans ce cas).

COMMENCE et MATCHS

BEGINS - renvoie TRUE si une chaîne commence par une autre chaîne.

string1 BEGINS string2

Si string1 COMMENCE avec (ou est égal à) string2, cela retournera true. Sinon, il retournera faux. Si la chaîne deux est vide (""), elle retournera toujours true.

BEGINS est très utile dans les requêtes où vous souhaitez rechercher le début de quelque chose, par exemple un nom. Mais c'est essentiellement une fonction travaillant sur des chaînes.

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.
DEFINE VARIABLE beg AS CHARACTER   NO-UNDO.

str = "HELLO".
beg = "HELLO".
DISPLAY str BEGINS beg. // yes

str = "HELLO".
beg = "H".
DISPLAY str BEGINS beg. // yes

str = "HELLO".
beg = "".
DISPLAY str BEGINS beg. // yes


str = "HELLO".
beg = "HELLO WORLD".
DISPLAY str BEGINS beg. // no

MATCHES renvoie true si certains critères de caractères génériques sont remplis dans une chaîne.

string1 MATCHES expression

Renvoie true si string1 correspond à l'expression générique:

* (astérisque) = 0 à n caractères (essentiellement n'importe quelle chaîne de n'importe quelle longueur)

. (point) = caractère générique pour tout caractère (sauf null)

DEFINE VARIABLE str AS CHARACTER   NO-UNDO.
DEFINE VARIABLE beg AS CHARACTER   NO-UNDO.

str = "HELLO".
beg = "HELLO".
DISPLAY str MATCHES beg. // yes

str = "HELLO".
beg = "H*".
DISPLAY str MATCHES beg. // yes

str = "HELLO".
beg = "*O".
DISPLAY str MATCHES beg. // yes

str = "HELLO WORLD".
beg = "HELLO.WORLD".
DISPLAY str MATCHES beg. // yes

str = "HELLO WORLD".
beg = "*WORL..".
DISPLAY str MATCHES beg. // no

str = "*HELLO WORLD".
beg = "WOR*LD".
DISPLAY str MATCHES beg. // no

Conversion des majuscules et minuscules

Comme mentionné précédemment, les chaînes sont normalement insensibles à la casse mais cela ne concerne que la comparaison des chaînes. Il y a des fonctions intégrées pour changer de boîtier.

CAPS (chaîne)

Rend la chaîne supérieure

LC (chaîne)

Rend les cordes minuscules

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.
DEFINE VARIABLE d AS CHARACTER   NO-UNDO.

c = "Hello".
d = "World".

DISPLAY CAPS(c) LC(d). // HELLO world

Rappelez-vous que les chaînes sont normalement insensibles à la casse

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.
DEFINE VARIABLE d AS CHARACTER   NO-UNDO.

c = "hello".
d = "hello".

DISPLAY CAPS(c) = LC(d). // yes

Sauf spécification comme CASE-SENSITIVE

DEFINE VARIABLE c AS CHARACTER   NO-UNDO CASE-SENSITIVE.
DEFINE VARIABLE d AS CHARACTER   NO-UNDO.

c = "hello".
d = "hello".

DISPLAY CAPS(c) = LC(d). // no

Des listes

Il existe un certain nombre de fonctions et de méthodes permettant de travailler avec des listes séparées par des virgules (ou d'autres caractères) dans Progress 4GL.

NUM-ENTRIES Renvoie le nombre d'entrées dans une liste. Vous pouvez éventuellement spécifier le délimiteur, la virgule est la valeur par défaut

NUM-ENTRIES (chaîne [, délimiteur])

En utilisant la virgule, le délimiteur par défaut:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY NUM-ENTRIES(cList). //3

En utilisant un autre délimiteur, semilcolon:

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye;cruel;world!".

DISPLAY NUM-ENTRIES(cList, ";"). //3

ENTRY - function - retourne une entrée spécifiée dans une liste

Comme d'habitude la position de départ est 1, pas 0!

ENTRÉE (entrée, liste [, délimiteur]).

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

DISPLAY ENTRY(2, cList). //cruel

ENTRY - méthode - attribuer la valeur d'une entrée spécifiée dans une liste

ENTRY (entrée, liste [, délimiteur]) = valeur

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Goodbye,cruel,world!".

ENTRY(1, cList) = "Hello".
ENTRY(2, cList) = "nice".

MESSAGE REPLACE(cList, ",", " ") VIEW-AS ALERT-BOX. //Hello nice world!

LOOKUP - vérifie une liste pour une entrée spécifique. Renvoie son entrée.

Si la chaîne n'est pas présente dans la liste, la recherche renvoie 0

LOOKUP (chaîne, liste [, délimiteur])

DEFINE VARIABLE cList AS CHARACTER   NO-UNDO.

cList = "Hello,nice,world!".

MESSAGE LOOKUP("nice", cList) VIEW-AS ALERT-BOX. //2
MESSAGE LOOKUP("cruel", cList) VIEW-AS ALERT-BOX. //0

Caractères spéciaux (et échapper)

Dans Progress 4GL, la manière normale d'écrire un caractère spécial est de le précéder d'un caractère tilde (~).

Ce sont les caractères spéciaux par défaut

Séquence Interprété comme Commentaire
~ " " Utilisé pour écrire "à l'intérieur des chaînes définies en utilisant" string ".
~ ' ' Utilisé pour écrire 'les chaînes internes définies à l'aide de' chaîne '.
~~ ~ Par exemple, si vous souhaitez imprimer la séquence et non comment elle est interprétée.
~ \ \
~ { { {est utilisé dans les préprocesseurs et parfois il est nécessaire de s’échapper.
~ nnn Un seul personnage nnn est un nombre octal représentant la valeur ascii du caractère.
~ t languette
~ n Nouvelle ligne / saut de ligne
~ r Retour de voiture
~ E Échapper
~ b Retour arrière
~ f Flux de formulaire

Si vous voulez afficher le tilde du tout, il doit être échappé!

MESSAGE "A single tilde: ~~" VIEW-AS ALERT-BOX.

MESSAGE "At sign: ~100" SKIP
        "Tab~tseparated~twords!" SKIP
        "A linefeed:~n"
        "Escaping a quote sign: ~"This is a quote!~"" SKIP VIEW-AS ALERT-BOX.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow