Importação de Dados.

06/02/2003

0

Tenho um arquivo txt conforme pedaço abaixo, que preciso fazer uma importação para meu banco:

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

Jussara

Responder

Posts

06/02/2003

Anonymous

var
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**}


Responder

06/02/2003

Jussara

Oi...
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.


Responder

10/02/2003

Jussara

Bom dia Pessoal.
Será que alguém pode meajudar nesta dúvida? Ainda não resolvi :cry:


Responder

10/02/2003

Jussara

Olá Amigos.
Estou novamente batendo na mesma tecla. Já tentei algumas formas para essa importação, mas não deu resultado....
Será que alguém sabe?


Responder

10/02/2003

Anonymous

Utilize o Copy para copiar e o Pos para obter a posição do ´;´ caso este seja o delimitador de campos.

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


Responder

11/02/2003

Jussara

Oi Fábio, obrigada. Mas acontece que não é delimitado por ;
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....


Responder

11/02/2003

Jussara

Nossa Amigos.... será que ninguém nunca fez isto? Já estou ficando doida....


Responder

12/02/2003

Carnette

Voce só pode estar doida mesmo...Por acaso voce tem a MASCARA que voce usou para salvar cada registro...Voce fez este tipo de definição...Isto tá parecendo aquele velho banco de dados usado em cobol...ISAM....ou então voce PIROU na definição do arquivo....

vc poderia me enviar um pedaço deste seu arquivo para eu dar uma olhada ???

carnettehenrique@hotmail.com


Responder

12/02/2003

Okama

Olá Jussara,

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


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar