25/09/2004

leitura em campo memo

Pessoal, tenho a seguinte duvida:
Em um dbMemo tenho o seguinte:
20/01/2004#25/02/2004125,3612,001DJOAO ....

Cada campo é separado por . Preciso ler cada campo ate a e gravar numa tabela a parte. Como faço isso? Não tenho a menor ideia.

Em tempo: os campos não tem tamanho fixo e são varios registros. o delimitador tem de ser a .
T+


Marc

Respostas

25/09/2004

Edilcimar

for i := 0 to memo1.lines.count -1 do
begin
texto := memo1.lines[i]
for j := 0 to length(texto) do
faça o que quizer
end


Responder Citar

25/09/2004

Aroldo Zanela

Colega,

No exemplo abaixo, eu peguei a sua linha de dados e salvei num arquivo texto denominado de TempFile.txt no temp de minha unidade e:. Em seguida, instanciei dois objetos da classe TStringList, a primeira para carregar o arquivo e a segunda para transformar cada linha numa nova lista que em cada linha contém um campo do registro.

TempFile.txt:
20/01/2004#25/02/2004125,3612,001DJOAO


OnClick:
var Arquivo: TStringList;
    Registro: TStringList;
    I, Z: SmallInt;
begin
  Arquivo:= TStringList.Create;
  Registro  := TStringList.Create;

  try

    Arquivo.LoadFromFile(´e:\temp\tempfile.txt´);
    Registro.Delimiter:= ´´;
    Z := Arquivo.Count-1;

    for I := 0 to Z do
    begin
      Registro.DelimitedText:= Arquivo.Strings&91;I&93;;
      Memo1.Lines.Assign(Registro); // faça aqui a gravação para o banco
    end;

  finally
    Registro.Free;
    Arquivo.Free;
  end;
end;


Resultado exposto num objeto da classe TMemo:
20/01/2004
25/02/2004
125,36
12,00
1
D
JOAO


Sabemos que está não é a rotina de melhor performance, mas é sem dúvida, a de menor esforço.


Responder Citar

25/09/2004

Marc

Agradeco a voces pela a ajuda. Funcionou.
T+


Responder Citar

25/09/2004

Zlink

Senhores

Como irei precisar desta rotina, resolvi testar, e algo não saiu muito bem, exemplo, quando a string tem espaço, o memo escreve na próxima linha:

o delimitador foi o @

Arquivo texto:
@N3BRADESCO @N4JOSE RICARDO HONORIO FERNANDES

Resultado:
N3BRADESCO
N4JOSE
RICARDO
HONORIO
FERNANDES

Como sanar este problema?

Ricardo


Responder Citar

26/09/2004

Zlink

Pessoal, Tem um problema:
Quando a string tem um espaço ex. JOÃO CAVALCANTE, a função trata como se fosse outro campo, e não:

20/01/2004#25/02/2004125,3612,001DJOAO CAVALCANTE ....

20/01/2004
25/02/2004
125,36
12,00
1
D
JOAO
CAVALCANTE

Como resolver este problema.

Ricardo


Responder Citar

26/09/2004

Aroldo Zanela

Colega,

Nesta caso, para aproveitar parte do código já implementado, faça as seguintes alterações:

var Arquivo: TStringList;
    Registro: TStringList;
    I, Z, X, Y, Delimitador, Comprimento: SmallInt;
    Linha: String;
begin
  Arquivo:= TStringList.Create;
  Registro  := TStringList.Create;

  try

    Arquivo.LoadFromFile(´e:\temp\tempfile.txt´);

    Z := Arquivo.Count-1;

    Registro.Clear;

    for I := 0 to Z do // Varrer o arquivo
    begin

      X:= 1;// posição inicial na linha
      Linha   := Arquivo.Strings[I&93;;
    Comprimento := Length(Linha);

    for Y := 1 to Comprimento do // varrer a linha
      begin
        Delimitador:= Pos(´´,Linha);      // Encontra a posição do delimitador
        if Delimitador>0 then
        begin
          Registro.Add(Copy(Linha,X,Delimitador-X)); // Armazena o "campo" em Registro 
          X := Delimitador+1;                         // Nova posição inicial na linha
          Linha[Delimitador&93; := Chr(255);// Troca o delimitador da última posição obtida
        end;
      end;
      Memo1.Lines.Assign(Registro);
    end;

  finally
    Registro.Free;
    Arquivo.Free;
  end;
end;



Responder Citar

26/09/2004

Zlink

Coloquei o novo código, mais não aparece nada no memo1

Ricardo


Responder Citar

26/09/2004

Aroldo Zanela

Colega,

Troquei a linha:
    Arquivo.LoadFromFile(´e:\temp\tempfile.txt´);

por:
    Arquivo.Add(´20/01/2004#25/02/2004125,3612,001DJOAO CAVALCANTE´);
    Arquivo.Add(´20/01/200425/02/2004125,3612,001DAROLDO ZANELA´);
    Arquivo.Add(´20/01/200425/02/2004125,3612,001DMARTE DIGITAL´);
    Arquivo.Add(´20/01/200425/02/2004125,3612,001DINFOAGENDA SISTEMAS´);
    Arquivo.Add(´20/01/200425/02/2004125,3612,001DAZ TECNOLOGIA E PRODUTOS´);


Resultado:

20/01/2004
25/02/2004
125,36
12,00
1
D
JOAO CAVALCANTE
20/01/2004
25/02/2004
125,36
12,00
1
D
AROLDO ZANELA
20/01/2004
25/02/2004
125,36
12,00
1
D
MARTE DIGITAL
20/01/2004
25/02/2004
125,36
12,00
1
D
INFOAGENDA SISTEMAS
20/01/2004
25/02/2004
125,36
12,00
1
D
AZ TECNOLOGIA E PRODUTOS


No seu caso, não esqueça de substituir o # por @ nesta linha:

        Delimitador   := Pos(´´,Linha);      // Encontra a posição do delimitador 


Também deverá trabalhar a rotina para o caso de não haver o delimitador no final da linha.


Responder Citar

27/09/2004

Dedi

Eu,fiz assim.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    Linha:string;
    LoadTxt,ResutTxt:TStringList;
begin
 LoadTxt:=TStringList.Create;
 ResutTxt:= TStringList.Create;
 LoadTxt.LoadFromFile(´d:\arquivotxt.txt´);

 for i:=1 to LoadTxt.Count do begin
  linha:=LoadTxt.Strings[i-1&93;;
  while (pos(´´,linha)>0) do  begin
   ResutTxt.Add(trim(copy(linha,1,pos(´´,linha)-1)));
   Delete(linha,1,pos(´´,linha));
  end;
 end;

 ShowMessage(ResutTxt.Text);
end;



Responder Citar

27/09/2004

Aroldo Zanela

Colega,

Existem várias formas para solucionar este problema. É importante lembrar que, é imprescindível construir o código dentro de blocos protegidos, liberar objetos, utilizar tipos adequados (variáveis) e principalmente, não ficar chamando métodos de contagem a cada iteração em estruturas de repetição, visando segurança e ganhos de performance.

Aqui tem mais algumas sugestões: http://delphiforum.icft.com.br/forum/viewtopic.php?t=28121&highlight=explode


Responder Citar

27/09/2004

Paulo_amorim

Olá

Tinha uma dúvida parecida, neste tópico ela foi resolvida a contento com um algoritmo, espero que ajude

http://delphiforum.icft.com.br/forum/viewtopic.php?t=43243&highlight=string


Responder Citar