Como dividir uma String em um Array utilizando Delphi
Isso pode parecer básico, mas no final das contas é muito útil e muitos não sabem, então resolvi compartilhar aqui no blog.
Muitas vezes temos que ler o conteúdo de uma string que contém várias informações separadas por algum caractere, geralmente isso ocorre em leitura de arquivos texto. Imagine a linha abaixo, onde você precisa identificar o conteúdo separado por vírgulas, cada string está entre aspas porque você pode ter conteúdos como endereço onde a vírgula é parte da string e não o delimitador.
“Barack Obama”, “President”, “United States”, “04/08/1961”
Utilizando TStringList podemos definir o delimitador a ser utilizado e desta forma percorrer o StringList conforme o exemplo abaixo.
program Project1; {$APPTYPE CONSOLE} uses SysUtils, Classes; procedure Split(const Delimiter: Char; Value: string; const Strings: TStrings); begin Assert(Assigned(Strings)); Strings.Clear; Strings.DelimitedText := Value; Strings.Delimiter := Delimiter; end; var List: TStringList; I : Integer; begin try List := TStringList.Create; try Split(',','"Barack Obama","President","United States","04/08/1961"', List); for I := 0 to List.Count -1 do Writeln(List[I]); Readln; finally List.Free; end; except on E: Exception do begin Writeln(E.ClassName, ': ', E.Message); Readln; end; end; end.
O resultado ao executar este programa será:
– Barack Obama
– President
– United States
– 04/08/1961
Simples, mas útil.
Olá Andreano,
Temos também uma forma ainda mais prática com a função “ExtractStrings” da unit Classes.
function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;
Separator – É um array onde você pode definir vários separadores
WhiteSpace – É um Array onde você define os caracteres que devem ser Ignorados quando ocorrerem no inicio da String.
Content – É a String de onde se deseja extrais as substrings.
E a Função ainda retorna o número de Substrings extraídas.
Neste caso seria +/- assim:
…
const
sStrings = ‘”Barack Obama”,”President”,”United States”,”04/08/1961″‘;
var
List: TStringList;
I,
iRetorno:Integer;
begin
Lista := TStringList.Create;
try
try
iRetorno := ExtractStrings([‘;’],[‘ ‘],PChar(sStrings), List);
for I := 0 to iRetorno do
Writeln(List[I]);
Readln;
except
on E: Exception do begin
Writeln(E.ClassName, ‘: ‘, E.Message);
Readln;
end;
finally
FreeAndNil(List);
end;
end;
Uma das vantagens é que podemos passar vários delimitadores para a mesma string.
abraços
Carlos Eduardo Paulino
cadumicro@hotmail.com