Hoe een afgebakende string in een stringlijst te parseren

Er zijn vaak momenten waarop je een string moet splitsen in een reeks strings door een karakter als scheidingsteken te gebruiken. Een CSV-bestand ("komma" gescheiden) kan bijvoorbeeld een regel hebben als "Zarko; Gajic ;; DelphiGuide" en u wilt dat deze regel wordt ontleed in 4 regels (tekenreeksen) "Zarko", "Gajic", "" ( lege tekenreeks) en "DelphiGuide" met het puntkomma ";" als een scheidingsteken.

Delphi biedt verschillende methoden om een ​​string te parseren, maar het kan zijn dat geen van beide precies doet wat u nodig hebt. De RTL-methode ExtractStrings gebruikt bijvoorbeeld altijd aanhalingstekens (enkel of dubbel) voor scheidingstekens. Een andere benadering is om de Delimiter en DelimitedText eigenschappen van de TStrings-klasse, maar helaas zit er een fout in de implementatie ("in" Delphi) waarbij het spatie-teken altijd wordt gebruikt als scheidingsteken.

De enige oplossing voor het ontleden van een gescheiden string is het schrijven van een eigen methode:

Voorbeeld van gescheiden tekenreeks

~~~~~~~~~~~~~~~~~~~~~~~~~
procedure ParseDelimited (const sl: TStrings; const waarde: string; const scheidingsteken: string);
var
dx: geheel getal;
ns: string;
txt: string;
delta: geheel getal;
beginnen
delta: = lengte (scheidingsteken);
txt: = waarde + scheidingsteken;
sl.BeginUpdate;
sl.Clear;
proberen
terwijl Lengte (txt)> 0 doen
beginnen
dx: = Pos (scheidingsteken, txt);
ns: = Kopiëren (txt, 0, dx-1);
sl.Add (ns);
txt: = Copy (txt, dx + delta, MaxInt);
einde;
Tenslotte
sl.EndUpdate;
einde;
einde;
~~~~~~~~~~~~~~~~~~~~~~~~~

Gebruik (vult Memo1 in):
ParseDelimited (Memo1.lines, 'Zarko; Gajic ;; DelphiGuide', ';')