Exportar .txt para Db

Delphi

24/06/2006

Pessoal,

Estou tentando exportando um arquivo txt para uma tabela db(paradox), até que exportar eu consegui mas com alguns erros, vejam só.

O formato do arquivo texto:
121542;EMPRESA TEXTIL;BRASIL;GOIANIA

O arquivo texto é enorme e usa o ponto e virgula com separador.

Estou usando os seguintes comandos:

var Txt : TextFile; Entrada : String; begin Assignfile(Txt,´Clientes.Txt´); Reset(Txt); While not Eoln(Txt) do begin Readln(Txt,Entrada); Table1.Insert; Table1.FieldByName(´Codigo´).Value := Copy(Entrada,01,05); Table1.FieldByName(´nome´).Value := Copy(Entrada,07,15); Table1.FieldByName(´pais´).Value := Copy(Entrada,35,20); Table1.FieldByName(´estado´).Value := Copy(Entrada,25,08); Table1.Post; end; CloseFile(Txt);


Porém estou com um problema como o campo codigo é infinito e o nome da empresa sempre varia, sempre os dados ficam todos errados.

Ex: o campo nome pega um pedaço do codigo e etc...

Como faço para determinar que cada campo leia somente até a virgula???

Me ajudem galera, estou quase doido já...kkkkkkkkkkkk

Antecipadamente, Muito obrigado.


Marcelovms

Marcelovms

Curtidas 0

Respostas

Aerreira

Aerreira

24/06/2006

Você está exportando ou importanto?!

Bom, o que eu acho melhor é tratar cada linha do TXT como um único texto, trazendo a linha inteira para uma variável string. Depois você vai varrendo a string caracter-a-caracter até encontrar um ponto-e-virgula. Quando encontrar o primeiro ´;´ já sabe que da posição zero até ali está o campo Código. Marca esse ponto, e continua procurando ´;´, quando encontrar outro ; sabe que da última parada + 1 até o ponto atual está o seu campo ´empresa´, e assim sucessivamente até encontrar todos os campos daquela linha. Depois é só jogar o que foi armazenado para a sua tabela, e passar para a próxima linha do TXT.

Dessa maneira os campos poderão ter qualquer tamanho, a rotina buscará a divisão entre eles baseando-se nos ; separadores, sem considerar o tamanho de cada campo.

Será que expliquei direito?


GOSTEI 0
Marcelovms

Marcelovms

24/06/2006

Estou tentando é importar mesmo, como eu faria para fazer essa varredura, já tentei de todo jeito e não conseguei!!!

Como eu adicionaria nessa rotina acima????


GOSTEI 0
Adriano Santos

Adriano Santos

24/06/2006

Estou tentando é importar mesmo, como eu faria para fazer essa varredura, já tentei de todo jeito e não conseguei!!! Como eu adicionaria nessa rotina acima????


Exemplinho básico pra vc iniciar:

procedure TForm1.Button1Click(Sender: TObject);
var
  Teste: string;
  Qtde: Integer;
  Inicio: Integer;
  Campo: string;
  I: Integer;
begin
  Teste := Edit1.Text;
  Inicio:= 1;
  Qtde:= 0;
  ListBox1.Items.Clear;
  for I := 1 to Length(Teste) do
  begin
    if Teste[I] = ´;´ then
    begin
      Campo := Copy(Teste, Inicio, Qtde);
      ListBox1.Items.Add(Campo);
      Inicio := I + 1;
      Qtde := 0;
    end
    else
      Inc(Qtde);
  end;
end;



GOSTEI 0
Aerreira

Aerreira

24/06/2006

Experimente algo mais ou menos assim:

var 
    Txt : TextFile; 
    Entrada, mCODIGO, mNOME, mPAIS, mESTADO: String; 
begin 
    Assignfile(Txt,´Clientes.Txt´); 
    Reset(Txt); 
    While not Eoln(Txt) do 
    begin 
       Readln(Txt,Entrada); 

       tmp2 := Entrada;

       mPOS := ansipos(´;´,tmp2);
       tmp := trim(copy(tmp2,1,mPOS-1));
       mCODIGO := tmp;

       tmp2 := copy(tmp2,mPOS+1,999);
       mPOS := ansipos(´;´,tmp2);
       tmp := trim(copy(tmp2,1,mPOS-1));
       mNOME := tmp;

       tmp2 := copy(tmp2,mPOS+1,999);
       mPOS := ansipos(´;´,tmp2);
       tmp := trim(copy(tmp2,1,mPOS-1));
       mPAIS := tmp;

       tmp2 := copy(tmp2,mPOS+1,999);
       mPOS := ansipos(´;´,tmp2);
       tmp := trim(copy(tmp2,1,mPOS-1));
       mESTADO := tmp;

       Table1.Insert; 
       Table1.FieldByName(´Codigo´).Value := mCODIGO; 
       Table1.FieldByName(´nome´).Value := mNOME; 
       Table1.FieldByName(´pais´).Value := mPAIS; 
       Table1.FieldByName(´estado´).Value := mESTADO; 
       Table1.Post; 
    end; 
CloseFile(Txt);



GOSTEI 0
POSTAR