Analysera en avgränsad sträng i en stränglista (Delphi)

Det finns många gånger när du behöver dela upp en sträng till en array av strängar genom att använda ett tecken som separator. Till exempel kan en CSV-fil ("komma" separerad) ha en rad som "Zarko; Gajic;; DelphiGuide "och du vill att den här raden ska delas in i fyra rader (strängar)" Zarko "," Gajic "," "(tom sträng) och" DelphiGuide "med hjälp av semikolonstecknet"; "som en avgränsare.

Delphi tillhandahåller flera metoder för att analysera en sträng, men du kanske tycker att ingen av dem gör exakt vad du behöver. Till exempel använder ExtractStrings RTL-metoden alltid citattecken (enstaka eller dubbla) för avgränsare. En annan metod är att användaavgränsare ochdelimitedtext egenskaperna i TStrings-klassen - men tyvärr finns det ett fel i implementeringen ("inuti" Delphi) där rymdkaraktären alltid används som en avgränsare.

~~~~~~~~~~~~~~~~~~~~~~~~~
procedur ParseDelimited (const sl: TStrings; const-värde: sträng; const delimiter: string);
var
dx: heltal;
ns: string;
txt: string;
delta: heltal;

instagram viewer

Börja
delta: = längd (avgränsare);
txt: = värde + avgränsare;
si. BeginUpdate;
si. Klar;
Prova
medan längd (txt)> 0 gör
Börja
dx: = Pos (avgränsare, txt);
ns: = Kopiera (txt, 0, dx-1);
si. Lägg till (ns);
txt: = Kopiera (txt, dx + delta, MaxInt);
slutet;
till sist
si. EndUpdate;
slutet;
slutet;
~~~~~~~~~~~~~~~~~~~~~~~~~

Användning (fyller i Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic;; DelphiGuide', ';')

instagram story viewer