importar arquivo txt para base firebird

Delphi

19/03/2011

Bom dia Pessoal, estou com um probleminha na hora de importar meu arquivo dados.txt para minha tabela; até que esta importando os arquivos o problema que não esta salvando com os campos corretamente esta desconfigurado; Por exemplo:   este é meu arquivo txt que gostaria de esportar desta maneira IFY1370;BNU024;C;AR168740432
ICJ1851;BMO797;C;AR168740431
DJF845;CMF889;C;AR685024888 mas ele esta gravando na tabela desta forma   MO797;C;16874043JF845;CMF889;
AR6850248EJL41L405;C;AR6850   Gostaria de uma ajuda eu acho que não estou conseguinto formatar os dados na hora de enviar para a tabela grato se alguem poder me dar esta força
Luciano Farias

Luciano Farias

Curtidas 0

Respostas

Marco Salles

Marco Salles

19/03/2011

luciano , vc pode quebrar as strings em um Array de Strings . Isto pode ser fetio utilizando as propriedades
delimiter , delimitedText , StrictDelimiter da classe TStrings;

veja um exemplo

procedure TForm1.Button2Click(Sender: TObject);
var
ListaGrava,ListaLer:Tstrings;
i:Integer;
begin
ListaGrava:=TStringList.Create;
ListaLer:=TStringList.Create;
try

listaLer.LoadFromFile('temp.txt');  //Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar

ListaGrava.Delimiter:=';';
listaGrava.StrictDelimiter:=True;

for i := 0 to pred(ListaLer.Count) do
begin
ListaGrava.DelimitedText:=ListaLer.Strings[i];
showmessage(ListaGrava.Strings[0]+sLineBreak+
            ListaGrava.Strings[1]+sLineBreak+
            ListaGrava.Strings[2]+sLineBreak+
            ListaGrava.Strings[3]);

{**********************************************
Aqui na verdade vc vai colocar a sua rotina de Exportação
SeuDataSet.append;
SeuDataSet.fieldByName('campo0').asstring:=ListaGrava.Strings[0];
SeuDataSet.fieldByName('campo1').asstring:=ListaGrava.Strings[1];
SeuDataSet.fieldByName('campo2').asstring:=ListaGrava.Strings[2];
SeuDataSet.fieldByName('campo3').asstring:=ListaGrava.Strings[3];
SeuDataSet.post;
******************************************************
}
end;
finally
  ListaGrava.Free;
  ListaLer.Free;
end;


Algumas versões do anteriores do Delphi não tem a propriedade StrictDelimiter , ai tem que fazer algebrismo

para saber mais sobre as propriedades citada acima

http://marcosalles.wordpress.com/2011/02/01/delimitedtext-commandtext-delimiter-quotechar-que-coisa-complicada/

GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Show de bola Marco Antonio; Funcionou perfeitamente, sua estrutura ja estou importando para dentro da minha base de dados, muito obrigado pela força. agora me diga uma coisa e se eu quiser importar junto uma data com este formato 2010-12-01 10:19:00; seria possivel, rotina de esportação ficaria como; mas até aqui muito obrigado novamente;   IBQuery1.Close;
  IBQuery1.ParamByName('DATA_PASSAGEM').?????????????????????? ficaria como   IBQuery1.ParamByName('CAVALO').AsString:=ListaGrava.Strings[1];
  IBQuery1.ParamByName('REBOQUE').asstring:=ListaGrava.Strings[2];
  IBQuery1.ParamByName('STATUS').asstring:=ListaGrava.Strings[3];
  IBQuery1.ParamByName('MIC_ID').asstring:=ListaGrava.Strings[4]; 
GOSTEI 0
Marco Salles

Marco Salles

19/03/2011

Esta data vem de onde ???

do proprio sistema ??? ou de algum lugar especifico ???
GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Marco; Esta data estou tentando importar junto com aquele arquivo txt que havia solicitado ajuda, por exemplo:   este  é meu arquivo dados.txt   2011-03-22 07:48:17;IWS694;BWL246;v;AR000105984
2011-03-22 07:49:12;BRD382;XXX111;v;AR000105970
2011-03-22 07:49:32;HZL3709;;v;AR000105855
2011-03-22 07:49:50;CZZ7313;DJC2132;v;AR000104161   nele eu tenho o Campo DataHora;placacavalo;placacarreta;status;documento, conforme sua rotina só não estou conseguindo importar o campo DATA_HORA; me da um erro gostaria de saber como posso formatar esta importação de data hora ja importando com a data correta   segue rotina abaixo:     IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('insert into tab_teste');
  IBQuery1.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
  IBQuery1.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');
  if not IBTransaction1.InTransaction then
  IBTransaction1.StartTransaction;
  IBQuery1.Close;
 // IBQuery1.ParamByName('DATA')??? (aqui não estou conseguinto formatar para gravar na base de dados)   IBQuery1.ParamByName('CAVALO').AsString :=ListaGrava.Strings[1];
  IBQuery1.ParamByName('REBOQUE').AsString:=ListaGrava.Strings[2];
  IBQuery1.ParamByName('STATUS').AsString :=ListaGrava.Strings[3];
  IBQuery1.ParamByName('MIC_ID').AsString :=ListaGrava.Strings[4];
  IBQuery1.Open;
GOSTEI 0
Marco Salles

Marco Salles

19/03/2011

hummm

Vc mudou o arquivo , logico tem que mudar o codigo

var
ListaGrava,ListaLer:Tstrings;
data,linha:String;
i,posini:Integer;
begin
ListaGrava:=TStringList.Create;
ListaLer:=TStringList.Create;
try
listaLer.LoadFromFile('temp.txt');  //Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar

ListaGrava.Delimiter:=';';
listaGrava.StrictDelimiter:=True;

for i := 0 to pred(ListaLer.Count) do
begin
posini:=pos(';',ListaLer.Strings[i]);
linha:=ListaLer.Strings[i];
data:=COPY(Linha,1,posini-1);
copy(Linha,1,posIni-1);
Linha:=copy(Linha,posini+1,length(Linha));
ListaGrava.DelimitedText:=Linha;
showmessage(data++sLineBreak+
            ListaGrava.Strings[0]+sLineBreak+
            ListaGrava.Strings[1]+sLineBreak+
            ListaGrava.Strings[2]+sLineBreak+
            ListaGrava.Strings[3]);

{**********************************************
Aqui na verdade vc vai colocar a sua rotina de Exportação
SeuDataSet.append;
SeuDataSet.fieldByName('SeuCampoData').asstring:=ListaGrava.Strings[0];
SeuDataSet.fieldByName('campo0').asstring:=ListaGrava.Strings[0];
SeuDataSet.fieldByName('campo1').asstring:=ListaGrava.Strings[1];
SeuDataSet.fieldByName('campo2').asstring:=ListaGrava.Strings[2];
SeuDataSet.fieldByName('campo3').asstring:=ListaGrava.Strings[3];
SeuDataSet.post;
******************************************************
}
end;
finally
  ListaGrava.Free;
  ListaLer.Free;
end;


ps) Aqui o data vai aparecer como 2011-03-22 07:48:17 , não sei se seu banco utiliza este
padrão para campos data ..Aqui esta Ano , mes , dia e alem disso o separador é um
Traço ... Caso o seu banco utilize outro tipo de formatação , basta formatar a
variavel data para que esta fique coerente com o seu banco . caso contrário terá um
erro na hora do post


GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Caro Marco Antonio ainda estou na briga para finalizar este meu projetinho  de importação de arquivo txt, ainda não consegui converter a data conforme as linha do meu arquivo a baixo; 2011-04-12 07:29:00;IEZ9395;MAF0687;C;AR000135131
2011-04-12 07:29:00;IEZ9395;MAF0687;C;AR000135131 O arquivo que recebo tem este formato de data e a minha base de dados não aceita este formato então teria que converter para 12/04/2011 07:29:00, mas estou encontrando bastante dificuldade, gostaria que vc Analisasse meu codigo completo logo abaixo e fique a vontade para alterar o mesmo, tentei converter desta maneira conforme outro colega havia me dado esta dicas,mas tambem não houve sucesso; dm.qrImpE.ParamByName('DATA').AsDateTime:=StrToDateTime(ListaGrava.Strings[0],'yyyy-mm-dd hh:nn:ss' );
mais uma vez agradeço ;  ------------------------------------------------------------------------------------- procedure TfrmImportar.sbImpEadiClick(Sender: TObject);
var
  ListaGrava,ListaLer:Tstrings;
  data,linha: String;
  i,posini:Integer;
    begin
    if edImporta.Text <> '' then
    begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
  try
    listaLer.LoadFromFile('C:\enLastre\eadisul.txt');//Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar
    ListaGrava.Delimiter:=';';
    ListaGrava.StrictDelimiter:=True;
    for i := 0 to pred(ListaLer.Count) do
    begin
     posini:= pos(';',ListaLer.Strings[i]);
     linha:=listaler.Strings[i];
     data:=copy(linha,1,posini-1);
     copy(linha,1,posini-1);
     linha :=copy(linha,posini+1,length(linha));
     ListaGrava.DelimitedText:=Linha;
     ListaGrava.DelimitedText:=ListaLer.Strings[i];
//rotina para importar dados tab_eadisul
      dm.qrImpE.Close;
      dm.qrImpE.SQL.Clear;
      dm.qrImpE.SQL.Add('insert into tab_eadisul');
      dm.qrImpE.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpE.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');
        if not dm.Transacao.InTransaction then
               dm.Transacao.StartTransaction;
               dm.qrImpE.Close;
               dm.qrImpE.ParamByName('DATA').AsString   := ListaGrava.Strings[0];
               dm.qrImpE.ParamByName('CAVALO').AsString := ListaGrava.Strings[1];
               dm.qrImpE.ParamByName('REBOQUE').AsString:= ListaGrava.Strings[2];
               dm.qrImpE.ParamByName('STATUS').AsString := ListaGrava.Strings[3];
               dm.qrImpE.ParamByName('MIC_ID').AsString := ListaGrava.Strings[4];
               dm.qrImpE.Open;
               dm.Transacao.Commit;
              end;
              finally
          ListaGrava.Free;
          ListaLer.Free;
          edImporta.Clear;
    end;
  end;
end;
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2011


var
  ListaGrava,ListaLer:Tstrings;
  i:Integer;

  sdatef: string;
  cdates: char;
begin
  sdatef := ShortDateFormat; // grava o formato de data original
  cdates := DateSeparator; // grava o separador de data original

  if edImporta.Text <> '' then
  begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
    try
      ListaLer.LoadFromFile('C:\enLastre\eadisul.txt');//Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar
      ListaGrava.Delimiter:=';';
      ListaGrava.StrictDelimiter:=True;

      // gera a intrucao SQL para a insercao dos registros
      dm.qrImpE.Close;
      dm.qrImpE.SQL.Clear;
      dm.qrImpE.SQL.Add('insert into tab_eadisul');
      dm.qrImpE.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpE.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');

      // aqui está o 'segredo'
      ShortDateFormat := 'yyyy-mm-dd'; // altera para o formato de data do arquivo
      DateSeparator := '-'; // altera para o separador de data do arquivo

      for i := 0 to pred(ListaLer.Count) do
      begin
        ListaGrava.DelimitedText := ListaLer.Strings[i];

        //rotina para importar dados tab_eadisul
        if not dm.Transacao.InTransaction then
          dm.Transacao.StartTransaction;

        dm.qrImpE.Close;
        dm.qrImpE.ParamByName('DATA').AsSQLTimeStamp := StrToSQLTimeStamp(ListaGrava.Strings[0]);
        dm.qrImpE.ParamByName('CAVALO').AsString := ListaGrava.Strings[1];
        dm.qrImpE.ParamByName('REBOQUE').AsString:= ListaGrava.Strings[2];
        dm.qrImpE.ParamByName('STATUS').AsString := ListaGrava.Strings[3];
        dm.qrImpE.ParamByName('MIC_ID').AsString := ListaGrava.Strings[4];
        dm.qrImpE.Open;
        dm.Transacao.Commit;
      end;
    finally
      ListaGrava.Free;
      ListaLer.Free;
      edImporta.Clear;
      ShortDateFormat := sdatef; // retorna ao formato de data original
      DateSeparator := cdates; // retorna ao separador de data original
    end;
  end;
end;



GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Bom Dia meu amigo obrigado por atender meu pedido de ajuda, mas estou lhe mandando o erro que gerou, pois adaptei seu codigo no projeto e mostrou este erro, o que poderia ser...     desde ja agrgadeço
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2011

publique o seu código, o conteúdo do arquivo, o banco de dados utilizado e o tipo do campo.

eu testei aquele código, com a data no formato '2001-04-21 07:29:00', utilizando banco de dados Firebird 2.1 com campo do tipo timestamp.

GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Bom dia Amigo conforme solicitou-me, segue as informações ______________________________________________________________________________________ Este é o meu codigo que estava utilizando onde eu não estava conseguindo formatar a Data do arquivo txt ______________________________________________________________________________________ var
  ListaGrava,ListaLer:Tstrings;
  data,linha: String;
  i,posini:Integer;
    begin
    if edImporta.Text <> '' then
    begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
   try
    listaLer.LoadFromFile('C:\enLastre\Argentina.txt');  //Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar
    ListaGrava.Delimiter:= ';';
      for i := 0 to pred(ListaLer.Count) do
      begin
      posini:= pos(';',ListaLer.Strings[i]);
      linha:= listaler.Strings[i];
      data:=copy(linha,1,posini-1);
      copy(linha,1,posini-1);
      linha :=copy(linha,posini+1,length(linha));
      ListaGrava.DelimitedText:=Linha;
      ListaGrava.DelimitedText:=ListaLer.Strings[i];
//rotina para importar dados tab_argentina
      dm.qrImpA.Close;
      dm.qrImpA.SQL.Clear;
      dm.qrImpA.SQL.Add('insert into tab_Argentina');
      dm.qrImpA.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpA.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');
        if not dm.Transacao.InTransaction then
               dm.Transacao.StartTransaction;
               dm.qrImpA.Close;
               dm.qrImpA.ParamByName('DATA').AsString   :=ListaGrava.Strings[0];
               dm.qrImpA.ParamByName('CAVALO').AsString :=ListaGrava.Strings[1];
               dm.qrImpA.ParamByName('REBOQUE').AsString:=ListaGrava.Strings[2];
               dm.qrImpA.ParamByName('STATUS').AsString :=ListaGrava.Strings[3];
               dm.qrImpA.ParamByName('MIC_ID').AsString :=ListaGrava.Strings[4];
               dm.qrImpA.Open;
               dm.Transacao.Commit;
               dm.qrImpA.Close;
            end;
        finally
  ListaGrava.Free;
  ListaLer.Free;
  edimporta.Clear;
  end;
end;
end;  ------------------------------------------------------------------------------------------ Aqui é seu codigo que havia enviado pelo forum para mim adaptei na minha rotina e apresentou o erro que postei anteriormente ------------------------------------------------------------------------------------------ var
 ListaGrava,ListaLer:Tstrings;
 i:Integer;
 data,linha: String;
 sdatef: string;
 cdates: char;
begin
  sdatef := ShortDateFormat; // grava o formato de data original
  cdates := DateSeparator; // grava o separador de data original   if edImporta.Text <> '' then
  begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
    try
      ListaLer.LoadFromFile('C:\enLastre\eadisul.txt');//Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar
      ListaGrava.Delimiter:=';';
//    ListaGrava.StrictDelimiter:=True;       // gera a intrucao SQL para a insercao dos registros
      dm.qrImpE.Close;
      dm.qrImpE.SQL.Clear;
      dm.qrImpE.SQL.Add('insert into tab_eadisul');
      dm.qrImpE.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpE.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');       // aqui está o 'segredo'
      ShortDateFormat := 'yyyy-mm-dd'; // altera para o formato de data do arquivo
      DateSeparator := '-'; // altera para o separador de data do arquivo       for i := 0 to pred(ListaLer.Count) do
      begin
        ListaGrava.DelimitedText := ListaLer.Strings[i];
      //rotina para importar dados tab_eadisul
      if not dm.Transacao.InTransaction then
        dm.Transacao.StartTransaction;
        dm.qrImpE.Close;
        dm.qrImpE.ParamByName('DATA').AsSQLTimeStamp := StrToSqlTimeStamp(ListaGrava.Strings[0]);
        dm.qrImpE.ParamByName('CAVALO').AsString     := ListaGrava.Strings[1];
        dm.qrImpE.ParamByName('REBOQUE').AsString    := ListaGrava.Strings[2];
        dm.qrImpE.ParamByName('STATUS').AsString     := ListaGrava.Strings[3];
        dm.qrImpE.ParamByName('MIC_ID').AsString     := ListaGrava.Strings[4];
        dm.qrImpE.Open;
        dm.Transacao.Commit;
      end;
    finally
      ListaGrava.Free;
      ListaLer.Free;
      edImporta.Clear;
      ShortDateFormat := sdatef; // retorna ao formato de data original
      DateSeparator := cdates; // retorna ao separador de data original
    end;
  end;
end; ------------------------------------------------------------------------------------------------- Aqui esta o conteudo do meu arquivo txt, gostaria de salientar para vc que entre a data e a hora tem um espaço, este espaço tambem esta me apresentando erro na hora da importação; este então é o arquivo maldito que quero importar para a tabela criada no firebird e não estou conseguindo;   2011-04-12 07:29:00;IEZ9395;MAF0687;C;AR000135131
2011-04-12 07:29:00;IEZ9395;MAF0687;C;AR000135131
2011-04-12 07:29:24;EFW0724;EFW0714;V;AR000135103
2011-04-12 07:30:01;DJF6492;DTB9722;V;AR000135070
2011-04-12 07:30:30;GLT275;HYJ243;V;AR000135152
2011-04-12 07:31:04;IML487;IIV565;V;AR000135161
2011-04-12 07:31:31;GYQ174;EUJ970;V;AR000135708
2011-04-12 07:31:52;FPG525;FQJ230;V;AR000135596
2011-04-12 07:32:23;EDX502;BTB575;V;AR000135727
2011-04-12 07:32:43;IGY3129;IHS0793;V;AR000135118
2011-04-12 07:33:01;ECL306;BRG104;V;AR000135672
2011-04-12 07:39:46;CRD997;CKB852;V;AR000135648
2011-04-12 07:40:06;HLD260;HLD259;V;AR000135714
2011-04-12 07:52:23;CQH929;HDT119;V;AR000135720
2011-04-12 07:52:49;JBR541;JAL215;V;AR000135707
2011-04-12 07:54:29;TVE915;RXF929;V;AR000135671
2011-04-12 07:54:46;WAI843;WCN215;V;AR000134534
2011-04-12 07:55:07;IJO976;HPK145;V;AR000134678
2011-04-12 07:55:26;WZN962;CRC700;V;AR000134633
2011-04-12 07:55:54;GTG849;GVY560;V;AR000135532 --------------------------------------------------------------------------------------------------------- aqui esta a estrutura do meu banco de dados que utilizo com firebird 2.1 + Delphi7 ---------------------------------------------------------------------------------------------------------     TAB_EADISUL (
  DATA TIMESTAMP,
  CAVALO VARCHAR(10) CHARACTER SET WIN1251 COLLATE WIN1251,
  REBOQUE VARCHAR(10) CHARACTER SET WIN1251 COLLATE WIN1251,
  STATUS VARCHAR(2) CHARACTER SET WIN1251 COLLATE WIN1251,
  MIC_ID VARCHAR(12) CHARACTER SET WIN1251 COLLATE WIN1251); --------------------------------------------------------------------------------------------------- Se voce precisa de mais alguma informação referente ao projetinho que estou criando, meu email de contato é: lmelo@eadisul.com.br agradeço muito se puder me ajudar a verificar onde estou pecando e se voce testou o codigo e funcionou porque, que na minha rotina não funciona. pode ser algum detalhe que não estou conseguindo desenvolver; fico no aguardo;   
   
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2011

var
 ListaGrava,ListaLer:Tstrings;
 i:Integer;
 data,linha: String;
 sdatef: string;
 cdates: char;
begin
  sdatef := ShortDateFormat; // grava o formato de data original
  cdates := DateSeparator; // grava o separador de data original
  if edImporta.Text <> '' then
  begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
    try
      ListaLer.LoadFromFile('C:\enLastre\eadisul.txt');//Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar
      ListaGrava.Delimiter:=';';

      ListaGrava.StrictDelimiter:=True; // *** PORQUE ESTA LINHA ESTA DESABILIDATA ????? ***

      // gera a intrucao SQL para a insercao dos registros
      dm.qrImpE.Close;
      dm.qrImpE.SQL.Clear;
      dm.qrImpE.SQL.Add('insert into tab_eadisul');
      dm.qrImpE.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpE.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');

      // aqui está o 'segredo'
      ShortDateFormat := 'yyyy-mm-dd'; // altera para o formato de data do arquivo
      DateSeparator := '-'; // altera para o separador de data do arquivo
      for i := 0 to pred(ListaLer.Count) do
      begin
        ListaGrava.DelimitedText := ListaLer[i];

        //rotina para importar dados tab_eadisul
        if not dm.Transacao.InTransaction then
          dm.Transacao.StartTransaction;

        dm.qrImpE.Close;
        dm.qrImpE.ParamByName('DATA').AsSQLTimeStamp := StrToSqlTimeStamp(ListaGrava[0]);
        dm.qrImpE.ParamByName('CAVALO').AsString     := ListaGrava[1];
        dm.qrImpE.ParamByName('REBOQUE').AsString    := ListaGrava[2];
        dm.qrImpE.ParamByName('STATUS').AsString     := ListaGrava[3];
        dm.qrImpE.ParamByName('MIC_ID').AsString     := ListaGrava[4];
        dm.qrImpE.Open;

        dm.Transacao.Commit;
      end;
    finally
      ListaGrava.Free;
      ListaLer.Free;
      edImporta.Clear;
      ShortDateFormat := sdatef; // retorna ao formato de data original
      DateSeparator := cdates; // retorna ao separador de data original
    end;
  end;
end;


se o seu StringList não possuir a propriedade StrictDelimiter você precisará criar uma rotina para separar os dados. a StringList não vai funcionar para você.


GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Meu amigo esta linha eu desabilitei pois ela trava o codigo pois fica solicitando que eu declare alguma variavel na uses, o que eu declaro na uses da unit, Conforme as informações que lhe passei voce testou ai e funcionou a rotina     ListaGrava.StrictDelimiter:=True; // *** PORQUE ESTA LINHA ESTA DESABILIDATA ????? ***
           
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2011

como eu disse, sem a propriedade StrictDelimiter não será possível fazer o que você precisa, pois o stringList usa o espaço como separador - além do caractere que você definiu.

no seu caso será necessário criar uma rotina para fazer a separação da string.

tente dessa forma:

var
  ListaGrava,ListaLer:Tstrings;
  i:Integer;
  data,linha: String;
  sdatef: string;
  cdates: char;

  procedure SeparaString(str: String; delimiter: char; var lista: TStrings);
  var i: integer;
  begin
    lista.Clear;
    while (str <> '') do
    begin
      i := pos(delimiter, str);
      if (i > 0) then
        lista.Add(copy(str,1,i-1))
      else
      begin
        lista.Add(str);
        i := Length(str);
      end;
      Delete(str, 1, i);
    end;
  end;

begin
  sdatef := ShortDateFormat; // grava o formato de data original
  cdates := DateSeparator; // grava o separador de data original
  if edImporta.Text <> '' then
  begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
    try
      ListaLer.LoadFromFile('C:\enLastre\eadisul.txt');//Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar

      // gera a intrucao SQL para a insercao dos registros
      dm.qrImpE.Close;
      dm.qrImpE.SQL.Clear;
      dm.qrImpE.SQL.Add('insert into tab_eadisul');
      dm.qrImpE.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpE.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');

      // aqui está o 'segredo'
      ShortDateFormat := 'yyyy-mm-dd'; // altera para o formato de data do arquivo
      DateSeparator := '-'; // altera para o separador de data do arquivo
      for i := 0 to pred(ListaLer.Count) do
      begin
        SeparaString(ListaLer[i], ';', ListaGrava);

        //rotina para importar dados tab_eadisul
        if not dm.Transacao.InTransaction then
          dm.Transacao.StartTransaction;

        dm.qrImpE.Close;
        dm.qrImpE.ParamByName('DATA').AsSQLTimeStamp := StrToSqlTimeStamp(ListaGrava[0]);
        dm.qrImpE.ParamByName('CAVALO').AsString     := ListaGrava[1];
        dm.qrImpE.ParamByName('REBOQUE').AsString    := ListaGrava[2];
        dm.qrImpE.ParamByName('STATUS').AsString     := ListaGrava[3];
        dm.qrImpE.ParamByName('MIC_ID').AsString     := ListaGrava[4];
        dm.qrImpE.Open;

        dm.Transacao.Commit;
      end;
    finally
      ListaGrava.Free;
      ListaLer.Free;
      edImporta.Clear;
      ShortDateFormat := sdatef; // retorna ao formato de data original
      DateSeparator := cdates; // retorna ao separador de data original
    end;
  end;
end;

note que não há mais qualquer referência ao delimitador da StringList.

GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Vc mudou o arquivo , logico tem que mudar o codigo

var
ListaGrava,ListaLer:Tstrings;
data,linha:String;
i,posini:Integer;
begin
ListaGrava:=TStringList.Create;
ListaLer:=TStringList.Create;
try
listaLer.LoadFromFile('temp.txt');  //Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar

ListaGrava.Delimiter:=';';
listaGrava.StrictDelimiter:=True;

for i := 0 to pred(ListaLer.Count) do
begin
posini:=pos(';',ListaLer.Strings[i]);
linha:=ListaLer.Strings[i];
data:=COPY(Linha,1,posini-1); ## Como eu formataria aqui a variavel data para (dd/mm/yyy hh:mm:ss)
copy(Linha,1,posIni-1);
Linha:=copy(Linha,posini+1,length(Linha));
ListaGrava.DelimitedText:=Linha;
showmessage(data++sLineBreak+
            ListaGrava.Strings[0]+sLineBreak+
            ListaGrava.Strings[1]+sLineBreak+
            ListaGrava.Strings[2]+sLineBreak+
            ListaGrava.Strings[3]);

{**********************************************
Aqui na verdade vc vai colocar a sua rotina de Exportação
SeuDataSet.append;
SeuDataSet.fieldByName('SeuCampoData').asstring:=ListaGrava.Strings[0];
SeuDataSet.fieldByName('campo0').asstring:=ListaGrava.Strings[0];
SeuDataSet.fieldByName('campo1').asstring:=ListaGrava.Strings[1];
SeuDataSet.fieldByName('campo2').asstring:=ListaGrava.Strings[2];
SeuDataSet.fieldByName('campo3').asstring:=ListaGrava.Strings[3];
SeuDataSet.post;
******************************************************
}
end;
finally
  ListaGrava.Free;
  ListaLer.Free;
end;


ps) Aqui o data vai aparecer como 2011-03-22 07:48:17 , não sei se seu banco utiliza este
padrão para campos data ..Aqui esta Ano , mes , dia e alem disso o separador é um
Traço ... Caso o seu banco utilize outro tipo de formatação , basta formatar a
variavel data para que esta fique coerente com o seu banco . caso contrário terá um
erro na hora do post
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2011

não entendi nada..... eu mudei o arquivo ????

você testou o código que eu te passei ???

var
  ListaGrava,ListaLer:Tstrings;
  i:Integer;
  data,linha: String;
  sdatef: string;
  cdates: char;

  procedure SeparaString(str: String; delimiter: char; var lista: TStrings);
  var i: integer;
  begin
    lista.Clear;
    while (str <> '') do
    begin
      i := pos(delimiter, str);
      if (i > 0) then
        lista.Add(copy(str,1,i-1))
      else
      begin
        lista.Add(str);
        i := Length(str);
      end;
      Delete(str, 1, i);
    end;
  end;

begin
  sdatef := ShortDateFormat; // grava o formato de data original
  cdates := DateSeparator; // grava o separador de data original
  if edImporta.Text <> '' then
  begin
    ListaGrava:=TStringList.Create;
    ListaLer:=TStringList.Create;
    try
      ListaLer.LoadFromFile('C:\enLastre\eadisul.txt');//Aqui vc vai colocar o caminho onde esta o Arquivo Txt que se quer exportar

      // gera a intrucao SQL para a insercao dos registros
      dm.qrImpE.Close;
      dm.qrImpE.SQL.Clear;
      dm.qrImpE.SQL.Add('insert into tab_eadisul');
      dm.qrImpE.SQL.Add('(DATA,CAVALO,REBOQUE,STATUS,MIC_ID) VALUES');
      dm.qrImpE.SQL.Add('(:DATA,:CAVALO,:REBOQUE,:STATUS,:MIC_ID)');

      // aqui está o 'segredo'
      ShortDateFormat := 'yyyy-mm-dd'; // altera para o formato de data do arquivo
      DateSeparator := '-'; // altera para o separador de data do arquivo
      for i := 0 to pred(ListaLer.Count) do
      begin
        SeparaString(ListaLer[i], ';', ListaGrava); // nova rotina para separar a string

        //rotina para importar dados tab_eadisul
        if not dm.Transacao.InTransaction then
          dm.Transacao.StartTransaction;

        dm.qrImpE.Close;
        dm.qrImpE.ParamByName('DATA').AsSQLTimeStamp := StrToSqlTimeStamp(ListaGrava[0]);
        dm.qrImpE.ParamByName('CAVALO').AsString     := ListaGrava[1];
        dm.qrImpE.ParamByName('REBOQUE').AsString    := ListaGrava[2];
        dm.qrImpE.ParamByName('STATUS').AsString     := ListaGrava[3];
        dm.qrImpE.ParamByName('MIC_ID').AsString     := ListaGrava[4];
        dm.qrImpE.Execute;

        dm.Transacao.Commit;
      end;
    finally
      ListaGrava.Free;
      ListaLer.Free;
      edImporta.Clear;
      ShortDateFormat := sdatef; // retorna ao formato de data original
      DateSeparator := cdates; // retorna ao separador de data original
    end;
  end;
end;


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

19/03/2011

então, /BeginEnd\, deu certo? conseguiu importar seu arquivo texto?
GOSTEI 0
Luciano Farias

Luciano Farias

19/03/2011

Emerson valeu mesmo pela força, sua dicas foram de grande valia, mas consegui formatar desta forma   criei uma variavel   Data:TDateTime e Joguei o conteuda da minha linha do txt onde havia a data e converti com esta rotina funcionou que foi uma Beleza e ta importando a data como eu queria;   Data:= strtodateTime(copy(linha,9,2)+'/'+copy(linha,6,2)+'/'+copy(linha,1,4)+''+copy(linha,12,8));   Grande Abraço   Eu teria outra duvida, se derrepente vc puder me dar mais esta ajudinha seria mais ou menos assim       tenho uma consulta em uma TABELA "A" por exemplo que jogarei para um dbgrid e deste dbgrid eu gostaria de fazer uma rotina de Isert com IBquery na TABELA "B" por exemplo, todas as duas tabelas tem campos iguais fico no aguardo se puder dar uma otima dica  
GOSTEI 0
José

José

19/03/2011

Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0
Fernando Rodrigo

Fernando Rodrigo

19/03/2011

vc poderá utilizar direto no firebird

INSERTEX INTO CLIENTE FROM CSV C:\CLIENTE.CSV DELIMITER ;
GOSTEI 0
POSTAR