Função ExtractStrings.

342 views
Skip to first unread message

Fernando Vargas

unread,
Dec 4, 2013, 12:21:21 PM12/4/13
to dug...@googlegroups.com
Fala pessoal, beleza.

Tenho um arquivo txt para ser lido e cada linha do arquivo é delimitado por um "@".

Eu estou usando a função ExtractStrings para poder separar os valores e tratar posteriormente.

A questão é o seguinte, segue uma linha do arquivo como exemplo:

16@AC@Rio Branco@[BRANCO]@1@M@[BRANCO]@Rio Branco@1200401

O que acontece o ExtractStrings separa a linha baseando e um array de delimitadores, um array de caracteres que serão ignorados a linha propriamente dita e um TStrings (onde será armazenado os valores.

Bom, o problema é que, na linha onde tem os [BRANCOS], não é armazenado no TStrings.

Por exemplo, dentro do TStrings era para ter o seguinte conteúdo

16
AC
Rio Branco
''
1
M
''
Rio Banco
1200401


Ao invés disso tem
16
AC
Rio Branco
1
M
Rio Branco
1200401


A questão é que ao invés do TStrings ter 9 índices, tem só 7.

Como se faz para a função ExtractStrings adicionar, também, os brancos da linha?

Grande abraço

--
Atenciosamente
Fernando C. Vargas - 51 95546697

Wilian Selzlein

unread,
Dec 4, 2013, 12:38:27 PM12/4/13
to dug...@googlegroups.com
Fernando,

Não estou na frente do delphi, mas, não tem talvez algum parâmetro oculto para "tratar" isso?



Enviado por Samsung Mobile



-------- Mensagem original --------
De : Fernando Vargas <nand...@gmail.com>
Data: 04/12/2013 9h21 (GMT-08:00)
Para: dug...@googlegroups.com
Assunto: [dug-rs] Função ExtractStrings.
--
--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
 
Twitter: @dugrs
http://www.facebook.com/groups/dugrs/
http://www.Vimeo.com/dugrs
 
---
You received this message because you are subscribed to the Google Groups "DUG-RS - Delphi Users Group Rio Grande do Sul" group.
To unsubscribe from this group and stop receiving emails from it, send an email to dug-rs+un...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
Mensagem verificada pelo ISP Antispam Visao Cloud Computing http://antispam.visao.psi.br

Fernando Vargas

unread,
Dec 4, 2013, 12:45:13 PM12/4/13
to dug...@googlegroups.com
Talvez tenha,

eu achei uma solução do no blog do Newton:

program exampleTStringList;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.Classes;

var
  lStringList: TStringList;
  li:integer;
begin
  try
    lStringList := TStringList.Create;
    lStringList.Delimiter := '@';
    lStringList.DelimitedText := '16@AC@Rio Branco@@1@M@@Rio Branco@1200401';

    for li := 0 to (lStringList.Count-1) do
      Writeln(lStringList[li]);

    Readln;

  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.


O problema é que ele só delimitar o "@" ele esta delimitando também o ' '.

Att.,

Newton Michel de Oliveira

unread,
Dec 4, 2013, 12:51:44 PM12/4/13
to dug...@googlegroups.com
olhe o exemplo em anexo.. so renomeia para .zip

Atenciosamente,
Newton Michel de Oliveira
Celular 55-51-92358577
http://br.linkedin.com/in/newtongaucho
http://twitter.com/newtongaucho

Coordenador e palestrante dos grupos:
*  (DUG-RS Delphi Users Grupo do RS (www.dug-rs.org) ) 
*  (DF-e - Documentos Fiscais Eletrônicos (http://www.facebook.com/groups/332215890175650/) 
Embarcadero Community Evangelist – Brazil



ex.zippppp

Fernando Vargas

unread,
Dec 4, 2013, 12:57:20 PM12/4/13
to dug...@googlegroups.com
Vou olhar Newton.

Valeu

Sandro Herbst

unread,
Dec 4, 2013, 12:59:13 PM12/4/13
to dug...@googlegroups.com
Boa tarde,

Tenho usado o seguinte:


function Split(const Str: string; Delimiter: Char): TStringList;
begin
  Result := TStringList.Create;
  Result.LineBreak := Delimiter;
  Result.Text := Str;
end;


Atenciosamente,

Sandro Herbst

Fernando Vargas

unread,
Dec 4, 2013, 1:02:55 PM12/4/13
to dug...@googlegroups.com
Sandro...

Show de bola funcionou perfeitamente....

Valeu cara, obrigado....

Att.,

Jair Roberto Silva

unread,
Dec 5, 2013, 7:11:31 AM12/5/13
to dug...@googlegroups.com
Para evitar esse comportamento, ative a propriedade "StrictDelimiter" do TStringList. Essa opção não existe em versões mais antigas do Delphi. No exemplo, ficaria:

  ...
    lStringList := TStringList.Create;
    lStringList.Delimiter := '@';
    lStringList.StrictDelimiter := True;
  ...


Um abraço,
Jair


Em 4 de dezembro de 2013 15:45, Fernando Vargas <nand...@gmail.com> escreveu:

Fernando Vargas

unread,
Dec 5, 2013, 7:17:54 AM12/5/13
to dug...@googlegroups.com
Opa Jair, tudo bem...

Vou testar aqui...

Att.,

Rafael Santos de Lima

unread,
Dec 5, 2013, 7:21:07 AM12/5/13
to dug...@googlegroups.com
O único que funcionou foi a solução do Sandro Herbst ("Split").
Mesmo com o "StrictDelimiter" para mim não funcionou.


2013/12/5 Fernando Vargas <nand...@gmail.com>

Newton Michel de Oliveira

unread,
Dec 5, 2013, 7:36:21 AM12/5/13
to dug...@googlegroups.com
mas Rafael.. o exemplo que te enviei.. te mandei até o codigo e funcionou perfeitamente.

Atenciosamente,
Newton Michel de Oliveira
Celular 55-51-92358577
http://br.linkedin.com/in/newtongaucho
http://twitter.com/newtongaucho

Coordenador e palestrante dos grupos:
*  (DUG-RS Delphi Users Grupo do RS (www.dug-rs.org) ) 
*  (DF-e - Documentos Fiscais Eletrônicos (http://www.facebook.com/groups/332215890175650/) 
Embarcadero Community Evangelist – Brazil





Rafael Santos de Lima

unread,
Dec 5, 2013, 7:49:20 AM12/5/13
to dug...@googlegroups.com
Na verdade não foi eu que mandei o email originalmente com dúvidas, mas entrei na discussão e baixei o teu código Newton.heheh.
Fiz o teste e ele faz a quebra, mas quebra também o "Rio Branco".
ex:
Rio
Branco

Então não corrigiu o problema da quebra de espaços entre os caracteres


2013/12/5 Newton Michel de Oliveira <newton...@gmail.com>

Fernando Vargas

unread,
Dec 5, 2013, 7:51:20 AM12/5/13
to dug...@googlegroups.com
E ai Newton o Rafael tem razão, ele faz a quebra, mas ele também esta quebrando todas as palavras de tem espaços.

Ex:
Rio Branco

Ele quebra desse  jeito
Rio
Branco

Att.,

Newton Michel de Oliveira

unread,
Dec 5, 2013, 8:02:06 AM12/5/13
to dug...@googlegroups.com
mesmo no exemplo.. fiz o teste aqui agora e não quebrou.. estranho..

Alessandro Fazenda

unread,
Dec 5, 2013, 8:15:25 AM12/5/13
to dug...@googlegroups.com
Olá pessoal!
Essa é a primeira mensagem que mando pro grupo! Obrigado por me aceitarem! :)

Pra fazer esse tipo de conversão que o Fernando precisa eu uso o StringReplace pra trocar o delimitador pela quebra de linha. Não sei se é o método mais seguro, mas funciona pra mim.

strMinhaStringList := TStringList.Create;
strMinhaStringList.Text := StringReplace('16@AC@Rio Branco@[BRANCO]@1@M@[BRANCO]@Rio Branco@1200401', '@', #13#10, [rfReplaceAll]);

Abraços!

Att,

Alessandro Fazenda
adrfa...@gmail.com
(51) 8116-0602

Fernando Vargas

unread,
Dec 5, 2013, 8:31:44 AM12/5/13
to dug...@googlegroups.com
E ai Alessandro tudo bem.

É uma saída eu vou fazer os testes de todos os jeitos e posto o resultado depois...

Att.,
Reply all
Reply to author
Forward
0 new messages