Muitas vezes você precisa dividir um corda em um matriz de cadeias usando um caractere como separador. Por exemplo, um arquivo CSV (separado por "vírgula") pode ter uma linha como "Zarko; Gajic;; DelphiGuide "e você deseja que esta linha seja analisada em 4 linhas (strings)" Zarko "," Gajic "," "(string vazia) e" DelphiGuide "usando o caractere ponto-e-vírgula"; "como um delimitador.
O Delphi fornece vários métodos para analisar uma string, mas você pode achar que nenhum deles faz exatamente o que você precisa. Por exemplo, o método RTL ExtractStrings sempre usa caracteres de aspas (simples ou duplos) para delimitadores. Outra abordagem é usar oDelimitador eDelimitedText propriedades da classe TStrings - mas, infelizmente, há um erro na implementação ("dentro" do Delphi) em que o caractere de espaço é sempre usado como um delimitador.
~~~~~~~~~~~~~~~~~~~~~~~~~
procedimento ParseDelimited (const sl: TStrings; valor const: string; delimitador const: string);
var
dx: inteiro;
ns: string;
txt: string;
delta: inteiro;
início
delta: = Comprimento (delimitador);
txt: = valor + delimitador;
sl. BeginUpdate;
sl. Claro;
experimentar
enquanto Comprimento (txt)> 0
início
dx: = Pos (delimitador, txt);
ns: = Copiar (txt, 0, dx-1);
sl. Adicionar (ns);
txt: = Copiar (txt, dx + delta, MaxInt);
fim;
finalmente
sl. EndUpdate;
fim;
fim;
~~~~~~~~~~~~~~~~~~~~~~~~~
Uso (preenche o Memo1):
ParseDelimited (Memo1.lines, 'Zarko; Gajic;; DelphiGuide ','; ')