Wiele razy trzeba podzielić strunowy w szyk ciągów znaków za pomocą znaku jako separatora. Na przykład plik CSV (oddzielony przecinkiem) może mieć wiersz taki jak „Zarko; Gajic;; DelphiGuide ”, a chcesz, aby ta linia została sparsowana do 4 linii (ciągów znaków)„ Zarko ”,„ Gajic ”,„ ”(pusty ciąg) i„ DelphiGuide ”przy użyciu znaku średnika„; ”jako separatora.
Delphi oferuje kilka metod do parsowania łańcucha, ale może się okazać, że żadna z nich nie robi dokładnie tego, czego potrzebujesz. Na przykład metoda ExtractStrings RTL zawsze używa cudzysłowów (pojedynczych lub podwójnych) do ograniczników. Innym podejściem jest użycieOgranicznik iDelimitedText właściwości klasy TStrings - ale niestety w implementacji („wewnątrz” Delphi) występuje błąd, w którym znak spacji jest zawsze używany jako separator.
~~~~~~~~~~~~~~~~~~~~~~~~~
Procedura ParseDelimited (const sl: TStrings; stała wartość: ciąg; const delimiter: string);
var
dx: liczba całkowita;
ns: string;
txt: string;
delta: liczba całkowita;
zaczynać
delta: = Długość (separator);
txt: = wartość + ogranicznik;
sl. BeginUpdate;
sl. Jasny;
próbować
podczas gdy Długość (txt)> 0 do
zaczynać
dx: = Pos (separator, txt);
ns: = Kopiuj (txt, 0, dx-1);
sl. Dodaj (ns);
txt: = Kopiuj (txt, dx + delta, MaxInt);
koniec;
Wreszcie
sl. EndUpdate;
koniec;
koniec;
~~~~~~~~~~~~~~~~~~~~~~~~~
Użycie (wypełnia notatkę 1):
ParseDelimited (Memo1.lines, „Zarko; Gajic;; DelphiGuide ','; ')