Analyser en avgrenset streng i en strengliste (Delphi)

Det er mange ganger når du trenger å dele opp en string inn i et matrise av strenger ved å bruke et tegn som separator. En CSV-fil ("komma" separert) kan for eksempel ha en linje som "Zarko; Gajic;; DelphiGuide ", og du vil at denne linjen skal bli delt inn i 4 linjer (strenger)" Zarko "," Gajic "," "(tom streng) og" DelphiGuide "ved å bruke semikolon-tegnet"; "som en avgrenser.

Delphi gir flere metoder for å analysere en streng, men du kan oppdage at ingen av dem gjør akkurat det du trenger. For eksempel bruker ExtractStrings RTL-metoden alltid sitatkarakterer (enkelt eller dobbelt) for avgrensere. En annen tilnærming er å brukedelimiter ogDelimitedText egenskapene til TStrings-klassen - men dessverre er det en feil i implementeringen ("inni" Delphi) der mellomromstegnet alltid brukes som en avgrenser.

~~~~~~~~~~~~~~~~~~~~~~~~~
prosedyre ParseDelimited (const sl: TStrings; const verdi: streng; const delimiter: streng);
Var
dx: heltall;
ns: streng;
txt: streng;
delta: heltall;
begynne
delta: = lengde (avgrenser);

instagram viewer

txt: = verdi + avgrenser;
sl. BeginUpdate;
sl. Klar;
prøve
mens lengde (txt)> 0 gjør
begynne
dx: = Pos (avgrenser, txt);
ns: = Kopier (txt, 0, dx-1);
sl. Legg til (ns);
txt: = Copy (txt, dx + delta, MaxInt);
slutt;
endelig
sl. EndUpdate;
slutt;
slutt;
~~~~~~~~~~~~~~~~~~~~~~~~~

Bruk (fyller ut Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic;; DelphiGuide', ';')