Conseils

Comment analyser une chaîne délimitée dans une liste de chaînes

Comment analyser une chaîne délimitée dans une liste de chaînes

Il est souvent nécessaire de fractionner une chaîne de caractères en un tableau de chaînes en utilisant un caractère comme séparateur. Par exemple, un fichier CSV ("séparé par une virgule") peut comporter une ligne du type "Zarko; Gajic ;; DelphiGuide" et vous souhaitez que cette ligne soit analysée en 4 lignes (chaînes) "Zarko", "Gajic", "" ( chaîne vide) et "DelphiGuide" en utilisant le point-virgule ";" comme un délimiteur.

Delphi fournit plusieurs méthodes pour analyser une chaîne, mais vous constaterez peut-être qu’aucune d’elles ne fait exactement ce dont vous avez besoin. Par exemple, la méthode RTL ExtractStrings utilise toujours des guillemets (simples ou doubles) pour les délimiteurs. Une autre approche consiste à utiliser leDélimiteur etTexte délimité propriétés de la classe TStrings - mais malheureusement, il existe un bogue dans l'implémentation ("à l'intérieur" de Delphi) dans lequel le caractère d'espace est toujours utilisé en tant que délimiteur.

La seule solution pour analyser une chaîne délimitée consiste à écrire votre propre méthode:

Exemple de chaîne délimitée

~~~~~~~~~~~~~~~~~~~~~~~~~
procedure ParseDelimited (const sl: TStrings; valeur const: chaîne; délimiteur const: chaîne);
var
dx: entier;
ns: chaîne;
txt: string;
delta: entier;
commencer
delta: = longueur (délimiteur);
txt: = valeur + délimiteur;
sl.BeginUpdate;
sl.Clear;
essayer
while Longueur (txt)> 0 do
commencer
dx: = Pos (délimiteur, txt);
ns: = copier (txt, 0, dx-1);
sl.Add (ns);
txt: = Copier (txt, dx + delta, MaxInt);
fin;
enfin
sl.EndUpdate;
fin;
fin;
~~~~~~~~~~~~~~~~~~~~~~~~~

Utilisation (remplit Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic ;; DelphiGuide', ';')