Array
(
)

Importar txt para db

Francisco Assis
   - 03 nov 2009

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.

Pjrm1470
   - 03 nov 2009

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.

0
|
0

Francisco Assis
   - 03 nov 2009

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

0
|
0

Pjrm1470
   - 04 nov 2009

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.

0
|
0

Pjrm1470
   - 04 nov 2009

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

0
|
0