
We are searching data for your request:
Upon completion, a link will appear to access the found materials.
Wiele razy trzeba podzielić ciąg na tablicę ciągów, używając znaku jako separatora. Na przykład plik CSV (oddzielony przecinkiem) może mieć wiersz taki jak „Zarko; Gajic ;; DelphiGuide”, a chcesz, aby ten wiersz został sparsowany do 4 linii (ciągów znaków) „Zarko”, „Gajic”, „” ( pusty ciąg) i „DelphiGuide” przy użyciu znaku średnika „;” jako separator.
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.
Jedynym rozwiązaniem do parsowania ograniczonego łańcucha jest napisanie własnej metody:
Przykład łańcucha ograniczonego
~~~~~~~~~~~~~~~~~~~~~~~~~
Procedura ParseDelimited (const sl: TStrings; const value: string; const delimiter: string);
var
dx: liczba całkowita;
ns: string;
txt: string;
delta: liczba całkowita;
zaczynać
delta: = Długość (separator);
txt: = wartość + separator;
sl.BeginUpdate;
sl.Clear;
próbować
podczas gdy Długość (txt)> 0 do
zaczynać
dx: = Pos (separator, txt);
ns: = Kopiuj (txt, 0, dx-1);
sl.Add (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', ';')
Odpowiedź nieporównywalnie ... :)
Jak przy okazji to niemożliwe.
Just Shine
Absolutnie z tobą się zgadzam. W tym coś też mi się wydaje, to dobry pomysł. Zgadzam się z Tobą.