Importar txt para db

03/11/2009

0

Eu tenho um arquivo de txt com o seguinte corpo:   codigo  Descrição     Quantidade 50855  Produto 1           100 56125  Produto 2           70             65214  Produto 3           60 .......   Como que eu importo esse texto para o meu banco de dados firebird?   Desde já agradeço.
Francisco Assis

Francisco Assis

Responder

Posts

03/11/2009

Pjrm1470

Dessa forma acho dificil de se fazer a importação.
Normalmente se tem um delimitador para separar cada campo.
Se o corpo do arquivo estivesse assim:
| Codigo;Descricao;Quantidade;
| 50855;Produto 1;100; | 56125;Produto 2;70;             | 65214;Produto 3;60;

O delimitador é " ; " (Ponto e virgula).
Sendo assim em cada linha vc pega cada caractere e vai formando a palavra. Chegou no delimitador, para ai e joga o valor a seu respectivo campo e pula para o proximo campo.

No seu caso terá que fazer uma verificação de espaços bem calculados.
Como se você tivesse que criar uma tabela imaginaria separando os campos e seus valores estão centralizados na tabela.

Alguns "Bancos" usam essa formatação nos arquivos txt para enviar informações.

Talvez eu n tenha ajudado, mas com isso vc terá uma noção de como podera resolver o problema.

Att,
Plínio.
Responder

03/11/2009

Francisco Assis

Plínio, obrigado. Você teria algum exemplo de calcular os espaços?
Responder

04/11/2009

Pjrm1470

No seu caso não terá uma lógica dinâmica de acordo com cada arquivo, pois não sei dizer se vc tem vários arquivos com formatos diferente. Neste seu caso:

| codigo  Descrição     Quantidade | 50855  Produto 1           100 | 56125  Produto 2           70             | 65214  Produto 3           60
Pensei assim:
| procedure TForm1.Button4Click(Sender: TObject);
| var
|   tx: TextFile;
|   st: String;
|   I, C: Integer; // C = Campo
| begin
|   AssignFile(tx, 'C:\arquivo.txt'); //le o arquivo
|   Reset(tx);
|   while not Eof(tx) do
|   begin
|     Readln(tx, st); //Joga a linha atual para a string
|     C := 1;
|     for I := 1 to Length(st) do //varre cada caractere da linha
|     begin
|       Campo[C] := Campo[C] + st[I];
|       if (I = 6) or (I = 18) then //Nas posições aonde penso ser o final do campo
|         Inc(C); //pula para o proximo campo
|     end;
|   end;
|   CloseFile(tx);
| end;
Legenda:
Campo[]: array[1..X] of String; //onde X é o numero de campos que tem. neste caso 3.

Lembre-se de que se tiver outros arquivos com formatações e espaços diferentes, você terá que fazer um codigo para cada um, pois não uma forma dinamica de se fazer isso sem ter um delimitador para dizer quando haverá a separação dos campos.

Espero que lhe ajude o exemplo.
Qlqr coisa so pergunta.

Att,
Plínio.
Responder

04/11/2009

Pjrm1470

"...Não terá uma lógica dinamica..."
Corrigindo, não há botão editar. poderia habilita-lo por 30-60s apos o post.
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