Cum să analizați un șir delimitat într-o listă de șiruri

Există de multe ori când trebuie să împărțiți un șir într-un șir de șiruri, folosind un caracter ca separator. De exemplu, un fișier CSV („virgulă” separat) ar putea avea o linie precum „Zarko; Gajic ;; DelphiGuide” și doriți ca această linie să fie analizată în 4 linii (șiruri) „Zarko”, „Gajic”, „„ ( șir gol) și "DelphiGuide" folosind caracterul semicolon ";" ca delimitator.

Delphi oferă mai multe metode pentru a analiza un șir, dar s-ar putea să găsiți că niciuna nu face exact ceea ce aveți nevoie. De exemplu, metoda ExtractStrings RTL folosește întotdeauna caractere de cotație (unice sau duble) pentru delimitatori. O altă abordare este utilizarea delimitator și DelimitedText proprietățile clasei TStrings, dar, din păcate, există o eroare în implementare („în interior” Delphi) unde caracterul spațial este întotdeauna folosit ca delimitator.

Singura soluție pentru analizarea unui șir delimitat este să scrieți o metodă proprie:

Exemplu de șiruri delimitate

~~~~~~~~~~~~~~~~~~~~~~~~~
procedura ParseDelimited (const sl: TStrings; const value: string; const delimiter: string);
var
dx: număr întreg;
ns: șir;
txt: șir;
delta: număr întreg;
începe
delta: = Lungime (delimiter);
txt: = valoare + delimitator;
sl.BeginUpdate;
sl.Clear;
încerca
în timp ce Length (txt)> 0 do
începe
dx: = Pos (delimiter, txt);
ns: = Copiere (txt, 0, dx-1);
sl.Adăugare (ns);
txt: = Copiere (txt, dx + delta, MaxInt);
Sfârșit;
in cele din urma
sl.EndUpdate;
Sfârșit;
Sfârșit;
~~~~~~~~~~~~~~~~~~~~~~~~~

Utilizare (completează Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic ;; DelphiGuide', '')