Een afgebakende string in een stringlijst parseren (Delphi)

Er zijn veel momenten waarop u een moet splitsen draad in een matrix tekenreeksen door een teken als scheidingsteken te gebruiken. Een CSV-bestand ("door komma's gescheiden") kan bijvoorbeeld een regel als "Zarko; Gajic;; DelphiGuide "en u wilt dat deze regel wordt geparseerd in 4 regels (strings)" Zarko "," Gajic "," "(lege string) en" DelphiGuide "met het puntkomma-teken"; "als scheidingsteken.

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

~~~~~~~~~~~~~~~~~~~~~~~~~
procedure ParseDelimited (const sl: TStrings; const waarde: string; const delimiter: string);
var

instagram viewer

dx: geheel getal;
ns: string;
txt: string;
delta: geheel getal;
beginnen
delta: = lengte (scheidingsteken);
txt: = waarde + scheidingsteken;
sl. BeginUpdate;
sl. Doorzichtig;
proberen
terwijl Lengte (txt)> 0 doen
beginnen
dx: = Pos (scheidingsteken, txt);
ns: = Kopiëren (txt, 0, dx-1);
sl. Voeg (ns) toe;
txt: = Kopiëren (txt, dx + delta, MaxInt);
einde;
Tenslotte
sl. EndUpdate;
einde;
einde;
~~~~~~~~~~~~~~~~~~~~~~~~~

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

instagram story viewer