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+
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
Curtidas 0
Respostas
Edilcimar
25/09/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
begin
texto := memo1.lines[i]
for j := 0 to length(texto) do
faça o que quizer
end
GOSTEI 0
Aroldo Zanela
25/09/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:
OnClick:
Resultado exposto num objeto da classe TMemo:
Sabemos que está não é a rotina de melhor performance, mas é sem dúvida, a de menor esforço.
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[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:
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.
GOSTEI 0
Marc
25/09/2004
Agradeco a voces pela a ajuda. Funcionou.
T+
T+
GOSTEI 0
Zlink
25/09/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
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
GOSTEI 0
Zlink
25/09/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
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
GOSTEI 0
Aroldo Zanela
25/09/2004
Colega,
Nesta caso, para aproveitar parte do código já implementado, faça as seguintes alterações:
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]; 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] := Chr(255);// Troca o delimitador da última posição obtida end; end; Memo1.Lines.Assign(Registro); end; finally Registro.Free; Arquivo.Free; end; end;
GOSTEI 0
Zlink
25/09/2004
Coloquei o novo código, mais não aparece nada no memo1
Ricardo
Ricardo
GOSTEI 0
Aroldo Zanela
25/09/2004
Colega,
Troquei a linha:
por:
Resultado:
No seu caso, não esqueça de substituir o # por @ nesta linha:
Também deverá trabalhar a rotina para o caso de não haver o delimitador no final da linha.
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.
GOSTEI 0
Dedi
25/09/2004
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]; 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;
GOSTEI 0
Aroldo Zanela
25/09/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
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
GOSTEI 0
Paulo_amorim
25/09/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
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
GOSTEI 0
Daniel Sobrinho
25/09/2004
meu caso é um pouco diferente, eu tenho um memo assim:
COLORIFICO 150G
PIMENTA DO REINO 20G
e preciso que ele fique com 10 ponto e virgula (;) por linha independente da quantidade espaços em branco:
COLORIFICO;150G;;;;;;;;;
PIMENTA;DO;REINO;20G;;;;;;;
COLORIFICO 150G
PIMENTA DO REINO 20G
e preciso que ele fique com 10 ponto e virgula (;) por linha independente da quantidade espaços em branco:
COLORIFICO;150G;;;;;;;;;
PIMENTA;DO;REINO;20G;;;;;;;
GOSTEI 0
Arthur Heinrich
25/09/2004
meu caso é um pouco diferente, eu tenho um memo assim:
COLORIFICO 150G
PIMENTA DO REINO 20G
e preciso que ele fique com 10 ponto e virgula (;) por linha independente da quantidade espaços em branco:
COLORIFICO;150G;;;;;;;;;
PIMENTA;DO;REINO;20G;;;;;;;
COLORIFICO 150G
PIMENTA DO REINO 20G
e preciso que ele fique com 10 ponto e virgula (;) por linha independente da quantidade espaços em branco:
COLORIFICO;150G;;;;;;;;;
PIMENTA;DO;REINO;20G;;;;;;;
Me parece que o correto deveria ser:
"COLORIFICO";150G;;;;;;;;;
"PIMENTA DO REINO";20G;;;;;;;;;
GOSTEI 0