Fórum Importar txt para bd com delimitador como se faz? #227220

20/04/2004

0

13| 44| 2| | |55712442080 |20/04/2004|11:20:53| 0:00:59|01| 0|000|00| 129|03|0|0|00|011E|9999|34691105|TSSANTAN
13| 45| 15| | |55713318491 |20/04/2004|11:21:14| 0:00:39|01| 0|000|00| 129|03|0|0|00|011E|9999|34691108|GFSILVA
13| 35| 16| | |55713461575 |20/04/2004|11:21:44| 0:00:17|01| 0|000|00| 129|03|0|0|00|011E|9999|34691101|SCHOSTIN
13| 9| 3| | |55412727952 |20/04/2004|11:21:32| 0:00:36|01| 0|000|00| 129|03|0|0|00|011E|9999|35633665|DCSANTOS

O arquivo está este formato !!!!
Preciso criar uma função que consigar carregar o arquivo para o banco!!
Alguem tem alguma idéia de como se faz?


Genial_reis

Genial_reis

Responder

Post mais votado

22/04/2004

Se usa algum tipo de delimitador, tente esse componente FREE, o PgCSV.
[url]http://www.khash.biz/[/url]


Gandalf.nho

Gandalf.nho
Responder

Gostei + 1

Mais Posts

21/04/2004

Aroldo Zanela

Colega,

Nas versões mais novas do Delphi (a partir do Delphi 6 - eu acho) você pode utilizar as propriedades e métodos da classe TStringList. No entando, fiz uma pequena rotina para ´explodir´ cada linha (registro) em várias linhas (cada campo numa linha), independente da versão do Delphi.

Tente reproduzir o teste em seu micro. Note que o arquivo testo deve ficar no diretório tempo com o nome TESTE.TXT, ou então, melhorar/alterar o código.

Se ficar alguma dúvida, pode postar aqui:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  // Classe para tratar o arquivo
  TImportarTexto = Class
  LinhaEntrada: String;
    Delimitador: Char;
    Registro: TStringList;
    Constructor Create;
    Destructor Destroy;
    Procedure Clear;
    Procedure Execute;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TImportarTexto }

procedure TImportarTexto.Clear;
begin
  LinhaEntrada := ´´;
  Delimitador  := ´|´; // Não utilizado
end;

constructor TImportarTexto.Create;
begin
Inherited Create;
  Registro := TStringList.Create;
end;

destructor TImportarTexto.Destroy;
begin
Inherited Destroy;
end;

procedure TImportarTexto.Execute;
var nPos: Integer;
begin
  Registro.Clear;
  nPos := 1;
  while (nPos > 0) do
  begin
    nPos := Pos(´|´, LinhaEntrada);
    if nPos>0 then
    begin
      Registro.Add(Copy(LinhaEntrada,1,nPos-1));
      LinhaEntrada := Copy(LinhaEntrada,nPos+1,Length(LinhaEntrada)-nPos);
    end;
  end;
  Registro.Add(LinhaEntrada);
end;

procedure TForm1.Button1Click(Sender: TObject);
var Importa: TImportarTexto;
    Arquivo: TStringList;
    nI, nX: Integer;
begin

  Arquivo:= TStringList.Create;
  Arquivo.LoadFromFile(´c:\temp\teste.txt´);
  Importa := TImportarTexto.Create;
  nX := Arquivo.Count - 1;

  For nI := 0 to nX do
  begin
    Importa.LinhaEntrada:= Arquivo.Strings[nI];
    Importa.Execute;
    ShowMessage(Importa.Registro.Text); // Mostra a linha formatada em campos/linhas
  end;

  Importa.Free;
  Arquivo.Free;
end;

end.



Responder

Gostei + 0

15/06/2016

Paulo Borges

Muito bom deu certinho , Parabens
Responder

Gostei + 0

29/06/2016

Victor Lima

Muito legal a solução :)=
Responder

Gostei + 0

04/07/2016

Roberto Wutke

13| 44| 2| | |55712442080 |20/04/2004|11:20:53| 0:00:59|01| 0|000|00| 129|03|0|0|00|011E|9999|34691105|TSSANTAN
13| 45| 15| | |55713318491 |20/04/2004|11:21:14| 0:00:39|01| 0|000|00| 129|03|0|0|00|011E|9999|34691108|GFSILVA
13| 35| 16| | |55713461575 |20/04/2004|11:21:44| 0:00:17|01| 0|000|00| 129|03|0|0|00|011E|9999|34691101|SCHOSTIN
13| 9| 3| | |55412727952 |20/04/2004|11:21:32| 0:00:36|01| 0|000|00| 129|03|0|0|00|011E|9999|35633665|DCSANTOS

O arquivo está este formato !!!!
Preciso criar uma função que consigar carregar o arquivo para o banco!!
Alguem tem alguma idéia de como se faz?





Bom dia amigo, vc tbm pode usar a função do delphi SplitString, que te retorna um array com as informações obtidas, aonde vc passa a sua string e o delimitador dela ( no seu caso pipe) ficaria assim.
O formato seria tipo esse: SplitString(Linha, '','' );
string delimitador
begin

Result := False;

// Fazendo as aberturas do arquivo txt
Arq_Txt := edt_local_arquivo.Text;
AssignFile( Arquivo_ret , Arq_Txt );
Reset ( Arquivo_ret );

Readln( Arquivo_ret , Linha );

while not Eof(Arquivo_ret)
do begin

Readln( Arquivo_ret , Linha );
LinhaQuebrada := SplitString(Linha, '','');

//Apos fazer os Split da linha, eu tenho as minhas posições que quero usar... veja abaixo que podemos converter para o tipo de dado que quisermos, de acordo com o campo do banco.

Query.Insert;

Query.FieldByName(''nro_filiacao'' ).AsInteger := StrToInt( Trim( LinhaQuebrada[ 1]) );
Query.FieldByName(''nro_resumo_venda'' ).AsInteger := StrToInt( Trim( LinhaQuebrada[ 2]) );
Query.FieldByName(''dat_comprovante_venda'').AsString := Trim( LinhaQuebrada[ 3]);
Query.FieldByName(''vlr_bruto'' ).AsFloat := LinhaQuebrada[ 4].ToDouble() / 100;
Query.FieldByName(''vlr_desconto'' ).AsFloat := LinhaQuebrada[ 5].ToDouble() / 100;
Query.FieldByName(''vlr_liquido'' ).AsFloat := LinhaQuebrada[ 6].ToDouble() / 100;
Query.FieldByName(''nro_cartao'' ).AsString := LinhaQuebrada[ 7];
Query.FieldByName(''tip_transacao'' ).AsString := LinhaQuebrada[ 8];

Query.Post;

// Fim While
end;

Result := True;

end;

A dica que foi dada acima também eé muito boa, mas essa pode te ajudar a economizar linhas de código.

Qualquer dúvida do SplitString segue um link com mais detalhes.. http://www.clipatecinformatica.com.br/2014/09/usando-funcao-splitstring-do-delphi.html

Bons códigos a todos
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar