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

Il y a plusieurs fois où vous devez diviser une chaîne 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 avoir une ligne comme "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 délimiteur.

Delphi propose plusieurs méthodes pour analyser une chaîne, mais vous constaterez peut-être qu'aucune ne fait exactement ce dont vous avez besoin. Par exemple, la méthode ExtractStrings RTL utilise toujours des guillemets (simples ou doubles) pour les délimiteurs. Une autre approche consiste à utiliser le Délimiteur et DelimitedText propriétés de la classe TStrings, mais malheureusement, il existe un bogue dans l'implémentation ("à l'intérieur" Delphi) où le caractère espace est toujours utilisé comme 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; const value: string; const delimiter: string);
var
dx: entier;
ns: chaîne;
txt: chaîne;
delta: entier;
commencer
delta: = Longueur (délimiteur);
txt: = valeur + délimiteur;
sl.BeginUpdate;
sl.Clear;
essayer
tandis que 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', ';')