leitura em campo memo
25/09/2004
0
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
Posts
25/09/2004
Edilcimar
begin
texto := memo1.lines[i]
for j := 0 to length(texto) do
faça o que quizer
end
25/09/2004
Aroldo Zanela
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.
25/09/2004
Zlink
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
26/09/2004
Zlink
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
26/09/2004
Aroldo Zanela
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;
26/09/2004
Aroldo Zanela
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.
27/09/2004
Dedi
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;
27/09/2004
Aroldo Zanela
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
27/09/2004
Paulo_amorim
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
21/12/2022
Daniel Sobrinho
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;;;;;;;
23/12/2022
Arthur Heinrich
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;;;;;;;;;
Clique aqui para fazer login e interagir na Comunidade :)