Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marvazoler

Importar txt no delphi

Recommended Posts

Olá galera, blz?

Tenho um programa e gostaria de saber como importar conteudo de arquivo txt no delphi.

estou usando delphi e firebird.

Desde ja agradeço!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde colega,

 

Primeiro, sem ver o código e saber a estrutura fica difícil dar sugestões de ajustes.... mas o erro é bem claro: você aparentemente está tentando inserir a mesma chave primária da tabela 2x .... provavelmente no arquivo há alguma informação duplicada e, quando executa o comando, dá violação de chave. o PK_Funcao provavelmente é o nome da chave primária na tabela que está dando o erro. Sugiro rastrear ou testar antes de inserir se a chave usada já não existe gravada e fazer um tratamento para estes casos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui com dois campos, so agora estou com duvida para mais campos, que tem codigo, nome completo

cpf, como eu faço neste caso?

 

var

//Declare uma variável do tipo TStringlist e declare tambem uma variavel para usarmos como um contador.

 

texto : TStringList;

i : integer;

 

begin

//Abertura da Tabela

// ClientDataSet1.Open;

 

//Aqui a variavel texto esta sendo atribuida

texto := TStringList.Create;

 

//Recebendo o arquivo

texto.LoadFromFile('C:\importar_cracha\CAD_FUNCAO.Txt');

// Usei um trim para que seja eliminado qualquer tipo de espaço antes e depois das linhas

texto.Text := trim(texto.Text);

 

// Inicio do laço para começar a gravar na tabela, o sistema pegará da primeira linha e fará ate a ultima...

for i := 0 to texto.Count -1 do

begin

ClientDataSet1.Insert;

 

//Usei o trim, pois quando exportei acrescentei alguns espaços em branco, para criar um layout

ClientDataSet1CODIGO.AsInteger := StrToInt(trim(copy(texto,1,3)));

ClientDataSet1DESCRICAO.AsString := (trimRight(copy(texto,4,20)));

 

ClientDataSet1.Post;

ClientDataSet1.ApplyUpdates(0);

 

/ end;

 

//Liberando a variável

texto.Free;

 

ShowMessage('Arquivos importados!');

 

O arquivo esta com ponto e virgula separando os campos, e agora?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Considerando que seus dados estejam separados por um ';', poderia fazer o uso de uma função para separar as informações lidas e retornar em um TStrings, onde pegaria cada informação a partir de uma posição num array em memória... a função seria esta:

 

 

Function TForm1.Explode(Texto, Separador : String) : TStrings;
var
    strItem       : String;
    ListaAuxUTILS : TStrings;
    NumCaracteres,
    TamanhoSeparador,
    I : Integer;
Begin
    Texto            := StringReplace(Texto, #9, ' ', [rfReplaceAll]); //Troca os Tabs por um espaço em branco
    ListaAuxUTILS    := TStringList.Create;
    strItem          := '';
    NumCaracteres    := Length(Texto);
    TamanhoSeparador := Length(Separador);
    I                := 1;
    While I <= NumCaracteres Do
      Begin
        If (Copy(Texto,I,TamanhoSeparador) = Separador) or (I = NumCaracteres) Then
          Begin
            if (I = NumCaracteres) then strItem := strItem + Texto[I];
            ListaAuxUTILS.Add(trim(strItem));
            strItem := '';
            I := I + (TamanhoSeparador-1);
          end
        Else
            strItem := strItem + Texto[I];

        I := I + 1;
      End;
    Explode := ListaAuxUTILS;
end;

 

Ai no seu código, para buscar as informações, você faria algo do tipo:

 

 

var      
    Arquivo   : TStringList;
    ArrayAux  : TStrings;
    iRegistro : Integer;
begin
 
//Abrir o arquivo para leitura
   try
      if Arquivo <> nil then
         FreeAndNil(Arquivo);
      Arquivo := TStringList.Create;
      Arquivo.LoadFromFile( IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'SeuArquivo.Txt' );
   except
      showmessage('Erro durante a criação do TStringList de leitura do arquivo ' + IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'Lista.csv');
      Exit;
   end;
   try
       iRegistro   := -1;
       while iRegistro < Arquivo.Count -1 do
       begin
          inc(iRegistro);
          ArrayAux  := Explode(Arquivo[iRegistro], ';'); //Pega os dados lidos de uma linha do arquivo e separa num array
        Showmessage('Primeiro Informação da linha: ' + Trim(ArrayAux[0]) + #13 +
                               'Segunda Informação da linha: ' + Trim(ArrayAux[1]) + #13 +
                               'Terceira Informação da linha: ' + Trim(ArrayAux[1])
                               );
   finally
    
   end;

 

A função acima já resolve seu primeiro problema, que é recuperar as informações do arquivo... quanto a gravação, das duas uma: ou você incluí um select antes de dar o insert pra ver se a informação já foi gravada na tabela e só insere se não existir, ou usa um bloco de instrução protegida (try .. except) e controla o erro por lá... por exemplo, você pode criar um arquivo de log de erros e depois usar ele pra analisar os problemas, algo do tipo....

 

 

procedure TForm1.GravaLog(sMensagem: String);
Var Arquivo   : TextFile;
    ArqLog    : String;
begin
   mmRetorno.Lines.Add(sMensagem);
   ArqLog   := IncludeTrailingBackslash(ExtractFilePath(paramstr(0))) + 'LogErros.txt';
   try
      AssignFile(Arquivo, ArqLog);
      {$I-}
         Reset(Arquivo);
      {$I+}
      if (IOResult <> 0)
         then Rewrite(Arquivo) { arquivo não existe e será criado }
      else
      begin
         CloseFile(Arquivo);
         Append(Arquivo); { o arquivo existe e será aberto para saídas adicionais }
      end;
      Writeln(Arquivo, sMensagem);
   Finally
      CloseFile(Arquivo);
   end;
end;

 

Ai usando a função acima ficaria assim seu código:

 

 

  for i := 0 to texto.Count -1 do
    begin
      try
          ClientDataSet1.Insert;

          //Usei o trim, pois quando exportei acrescentei alguns espaços em branco, para criar um layout
          ClientDataSet1CODIGO.AsInteger := StrToInt(trim(copy(texto[i],1,3)));
          ClientDataSet1DESCRICAO.AsString := (trimRight(copy(texto[i],4,20)));

          ClientDataSet1.Post;
          ClientDataSet1.ApplyUpdates(0);
      except
       On E: Exception do
          GravaLog('Erro durante a inserção dos dados na tabela.... ' + #13 +
                           'Código: ' + trim(copy(texto[i],1,3)) + #13 +
                           'Descrição: ' + trimRight(copy(texto[i],4,20)) + #13 +
                            Erro Reportado: E.Message);
      end; //End Try .. except
    end; //End FOR

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, consegui usando as dicas de vcs, kkk

 

Só que meu diretor me pediu outra coisa, pra variar.

Dentro do arquivo txt existe o nome completo, como eu pego so o primeiro nome do camarada?

 

Desde ja agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você depois de separar a string no array com os exemplos acima, pode pegar e verificar o primeiro espaço em branco na string (comando Pos) e depois fazer um copy do começo até ele.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia, seguinte, tenho um comando que deu certo tambem, porem, nao pegou o primeiro nome antes do espaço

 

//Para pegar o nome completo

J:=J+i;
i:=Pos(';',copy(entrada,j,Tamanho));
ClientDataSet1NOME.Value:=Copy(Entrada,j,i-1);//Nome;

// Para pegar so o nome do camarada, é aqui que esta pegando, ele nao esta enviando nada para o campo a baixo.

J:=J+i;
i:=Pos(' ',copy(entrada,j,Tamanho));
ClientDataSet1NOME_FRENTE.Value:=Copy(Entrada,j,i-1);//Nome Cracha;

como corrigir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Suponho que você esteja usando aquela função para separar em um TStrings que passei antes correto? Se sim, poderia fazer desta forma:

 

 

ClientDataSet1NOME_FRENTE.Value:= Copy(Trim(ArrayAux[0]), 1, Pred(Pos(\' \', Trim(ArrayAux[0]) )) ); 

 

Não testei aqui mas acredito que funcione. Tirei e adaptei o comando pro seu caso neste formato deste link: http://www.activedelphi.com.br/forum/viewtopic.php?p=13206&sid=e5efd0e298e8d6f63a85c601a3f30161 ... qualquer coisa posta ai.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.