Importação de Dados.
06/02/2003
0
No.200033352 15/12/1998 403
Tit.U.S.P.A
C.N.P.J./C.I.C. : 0377007
Apres.: Figurativa ; Nat.: De Produto
CFE(4) 3.6.1
NCL(8) 18 bolsas.
Procurador: GARCIA & ASSOCIADOS S/C
No.200033360 11/05/1999 403
Tit.ITAQUE
C.N.P.J./C.I.C. : 37459666000
Apres.: Mista ; Nat.: De Produto
Marca: GRUPO ITAQUE
CFE(4) 25.7.1
NCL(8) 33 aguapé.
Apostila: SEM DREITO AO USO.
Procurador: COMÉRCIO E SERVIÇOS LTDA.
O problema é o seguinte. Sempre fiz importação onde 1 registro equivalia a 1 linha.
Agora não, 1 registro pode ser 7 ou 9 linhas e ainda 1 linha pode conter dados para dois campos diferentes, como é o caso, seguindo o exemplo, de Apres.: Figurativa ; Nat.: De Produto, Apres é um campo da minha tabela e Nat é outro.
O que me faz saber que mudou de registro é qdo a linha inicia com No.
Alguém pode me ajudar? Estou usando o interbase.
Jussara
Posts
06/02/2003
Anonymous
sArquivo: TextFile;
Entrada, sArq2: string;
iLinha: integer;
begin
tblCep.Open;
tblCepLoc.Open;
bCancelaImport := False;
AssignFile(sArquivo, FileNameEdit1.FileName);
sArq2 := After(´Cep_Loc.txt´,FileNameEdit1.FileName);
iLinha := 0;
if FileNameEdit1.FileName = ´C:\Download\Ceps\Cep_loc.txt´ then begin
// Arquivo de Localidades
RzProgressBar1.TotalParts := 0;
RzProgressBar1.TotalParts := NumLinhasArq(FileNameEdit1.FileName);
Reset(sArquivo);
Readln(sArquivo,Entrada);
while not Eoln(sArquivo) do begin
Inc(iLinha);
Readln(sArquivo,Entrada);
// 0 = Base Total e 2 = Inclusao
if (copy(Entrada,90,1) = ´0´) or (copy(Entrada,90,1) = ´2´) then
begin
tblCepLoc.Append;
tblCepLoc.FieldByName(´cep_ChvLocal´).AsString :=
copy(Entrada,1,6);
tblCepLoc.FieldByName(´cep_Cidade´).AsString :=
copy(Entrada,7,60);
tblCepLoc.FieldByName(´cep_UF´).AsString := copy(Entrada,75,2);
try
tblCepLoc.Post;
except
tblCepLoc.Cancel;
end;
end
else if (copy(Entrada,90,1) = ´1´) then begin // Exclusao
if tblCepLoc.Locate(´cep_ChvLocal´, copy(Entrada,1,6),
[loPartialKey]) then
tblCepLoc.Delete;
end
else if (copy(Entrada,90,1) = ´3´) then begin // Alteracao
if tblCepLoc.Locate(´cep_ChvLocal´, copy(Entrada,1,6),
[loPartialKey])
then begin
tblCepLoc.Edit;
tblCepLoc.FieldByName(´cep_Cidade´).AsString :=
copy(Entrada,7,60);
tblCepLoc.FieldByName(´cep_UF´).AsString :=
copy(Entrada,75,2);
end;
try
tblCepLoc.Post;
except
tblCepLoc.Cancel;
end;
end;
RzProgressBar1.PartsComplete := iLinha;
Application.ProcessMessages;
if bCancelaImport then
Break;
end;
CloseFile(sArquivo);
end;
{** o exemplo acima esta no site http://www.lloydsoft.hpg.ig.com.br/
é so baixar um dos arquivos de dicas**}
06/02/2003
Jussara
Mas pelo que entendi do seu exemplo, uma linha vale um registro, não é?
E meu problema é que 1 registro equivale a mais de uma linha.
10/02/2003
Jussara
Será que alguém pode meajudar nesta dúvida? Ainda não resolvi :cry:
10/02/2003
Jussara
Estou novamente batendo na mesma tecla. Já tentei algumas formas para essa importação, mas não deu resultado....
Será que alguém sabe?
10/02/2003
Anonymous
Utilize algo do tipo:
Var
I: Integer;
Begin
ListBox1.Items.LoadfromFile(´teste.txt´);
For I:=0 to ListBox1.ItemCount-1 Do
Begin
Copy(ListBox1.Items[I], 0, Pos(´;´, ListBox1.Items[I]));
end;
end;
Vc vai ter que fazer uma coisa mais complexa caso existam números não definidos (aleatórios) de ´;´ na mesma linha.
Espero ter ajudado,
[]´s
Fabio
11/02/2003
Jussara
Por exemplo, no trecho abaiixo, as 7 linhas fazem parte de um único regsitro. Onde na primeria linha existem os campos NRO, DATA e PROCESSO. Na segunda linha só o campo TITULO; na terceira linha o campo CNPJ; na quarta os campos APRES e NATUREZA e assim por diante.
O regiistro só vai mudar qdo a linha se iniciar por outro No.
No.200033352 15/12/1998 403
Tit.U.S.P.A
C.N.P.J./C.I.C. : 0377007
Apres.: Figurativa ; Nat.: De Produto
CFE(4) 3.6.1
NCL( 18 bolsas.
Procurador: GARCIA & ASSOCIADOS S/
Por favor, se alguém puder me ajudar....
11/02/2003
Jussara
12/02/2003
Carnette
vc poderia me enviar um pedaço deste seu arquivo para eu dar uma olhada ???
carnettehenrique@hotmail.com
12/02/2003
Okama
Já fiz várias importações e exportações para .txt; no seu caso é um pouco mais complexo porque uma linha pode ser dois ou mais campos e você não tem uma quantidade de linhas pré-definidas.
O que posso adiantar (sem testar) é que utilize a Função COPY e POS para tratar cada linha.
Para cada linha lida verifique se começa com ´No.´
if Copy(LINHA,1,3) = ´No.´ then
... INICIA NOVO REGISTRO...
Para vários campos na mesma linha verifique a existência do delimitador:
if Pos(´;´,LINHA) >0 THEN begin
Copy(LINHA,1,Pos(´;´LINHA)) // Primeiro Campo
Copy(LINHA,Pos(´;´,LINHA), <Quantidade>) //Segundo Campo
end;
Você sabe o tamanho de cada Prefixo do campo (´No.´, ´Tit´, ´Apres´) é só calcular que o restante é ´CAMPO´.
Qualquer dúvida escreva para meu e-mail e mande uma parte do texto se possível.
Um Abraço,
Okama
tecnobytecorp@bol.com.br
Clique aqui para fazer login e interagir na Comunidade :)