Det finns många gånger när du behöver dela en sträng i en rad strängar genom att använda ett tecken som separator. En CSV-fil ("komma" separerad) kan till exempel 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 karaktär i kolon ";" 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ända avgränsare och delimitedtext 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.
Den enda lösningen för att analysera en avgränsad sträng är att skriva en egen metod:
~~~~~~~~~~~~~~~~~~~~~~~~~
procedur ParseDelimited (const sl: TStrings; const value: string; const delimiter: string);
var
dx: heltal;
ns: string;
txt: string;
delta: heltal;
Börja
delta: = längd (avgränsare);
txt: = värde + avgränsare;
sl.BeginUpdate;
sl.Clear;
Prova
medan längd (txt)> 0 gör
Börja
dx: = Pos (avgränsare, txt);
ns: = Kopiera (txt, 0, dx-1);
sl.Tillfoga (ns);
txt: = Kopiera (txt, dx + delta, MaxInt);
slutet;
till sist
sl.EndUpdate;
slutet;
slutet;
~~~~~~~~~~~~~~~~~~~~~~~~~
Användning (fyller i Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic ;; DelphiGuide', ';')