Importação de Dados.
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.
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
Curtidas 0
Respostas
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**}
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
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.
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
06/02/2003
Bom dia Pessoal.
Será que alguém pode meajudar nesta dúvida? Ainda não resolvi :cry:
Será que alguém pode meajudar nesta dúvida? Ainda não resolvi :cry:
GOSTEI 0
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?
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
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
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
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....
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
06/02/2003
Nossa Amigos.... será que ninguém nunca fez isto? Já estou ficando doida....
GOSTEI 0
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
vc poderia me enviar um pedaço deste seu arquivo para eu dar uma olhada ???
carnettehenrique@hotmail.com
GOSTEI 0
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
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