Analyser en afgrænset streng i en strengliste (Delphi)

Der er mange gange, hvor du skal dele en snor ind i en matrix af strenge ved hjælp af et tegn som separator. For eksempel kan en CSV-fil ("komma" separeret) muligvis have en linje som "Zarko; Gajic;; DelphiGuide ", og du vil have, at denne linje skal parses i 4 linjer (strenge)" Zarko "," Gajic "," "(tom streng) og" DelphiGuide "ved hjælp af semikolon-tegnet"; "som en afgrænser.

Delphi giver flere metoder til at analysere en streng, men du kan opdage, at ingen af ​​dem gør nøjagtigt, hvad du har brug for. F.eks. Bruger ExtractStrings RTL-metoden altid citationstegn (enkelt eller dobbelt) til afgrænsere. En anden tilgang er at brugeafgrænsningstegn ogDelimitedText egenskaber for TStrings-klassen - men desværre er der en fejl i implementeringen ("inde" i Delphi), hvor rumtegnet altid bruges som en afgrænser.

~~~~~~~~~~~~~~~~~~~~~~~~~
procedure ParseDelimited (const sl: TStrings; const-værdi: streng; const delimiter: string);
Var
dx: heltal;
ns: streng;
txt: streng;
delta: heltal;
begynde
delta: = længde (afgrænser);

instagram viewer

txt: = værdi + afgrænser;
sl. BeginUpdate;
sl. Klar;
prøve
mens længde (txt)> 0 gør
begynde
dx: = Pos (afgrænser, txt);
ns: = Kopi (txt, 0, dx-1);
sl. Tilføj (ns);
txt: = Copy (txt, dx + delta, MaxInt);
ende;
endelig
sl. EndUpdate;
ende;
ende;
~~~~~~~~~~~~~~~~~~~~~~~~~

Brug (udfylder Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic;; DelphiGuide', '')

instagram story viewer