Importação de Dados.

Delphi

06/02/2003

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

Curtidas 0

Respostas

Anonymous

Anonymous

06/02/2003

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


GOSTEI 0
Jussara

Jussara

06/02/2003

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.


GOSTEI 0
Jussara

Jussara

06/02/2003

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


GOSTEI 0
Jussara

Jussara

06/02/2003

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?


GOSTEI 0
Anonymous

Anonymous

06/02/2003

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


GOSTEI 0
Jussara

Jussara

06/02/2003

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


GOSTEI 0
Jussara

Jussara

06/02/2003

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


GOSTEI 0
Carnette

Carnette

06/02/2003

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


GOSTEI 0
Okama

Okama

06/02/2003

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


GOSTEI 0
POSTAR