Array
(
)

leitura em campo memo

Marc
   - 25 set 2004

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+


Edilcimar
   - 25 set 2004

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


Aroldo Zanela
   - 25 set 2004

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:
#Código

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


OnClick:
#Código
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[I];
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:
#Código
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.


Marc
   - 25 set 2004

Agradeco a voces pela a ajuda. Funcionou.
T+


Zlink
   - 25 set 2004

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


Zlink
   - 26 set 2004

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


Aroldo Zanela
   - 26 set 2004

Colega,

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

#Código

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];
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 {TStringList}
X := Delimitador+1; // Nova posição inicial na linha
Linha[Delimitador] := Chr(255);// Troca o delimitador da última posição obtida
end;
end;
Memo1.Lines.Assign(Registro);
end;

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



Zlink
   - 26 set 2004

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

Ricardo


Aroldo Zanela
   - 26 set 2004

Colega,

Troquei a linha:
#Código

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

por:
#Código
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:

#Código
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:

#Código
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.


Dedi
   - 27 set 2004

Eu,fiz assim.#Código

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];
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;



Aroldo Zanela
   - 27 set 2004

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


Paulo_amorim
   - 27 set 2004

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