importar arquivo txt para base firebird

19/03/2011

0

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

Responder

Posts

20/03/2011

Marco Salles

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/

Responder

22/03/2011

Luciano Farias

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]; 
Responder

23/03/2011

Marco Salles

Esta data vem de onde ???

do proprio sistema ??? ou de algum lugar especifico ???
Responder

23/03/2011

Luciano Farias

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;
Responder

23/03/2011

Marco Salles

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


Responder

02/05/2011

Luciano Farias

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;
Responder

03/05/2011

Emerson Nascimento


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;



Responder

03/05/2011

Luciano Farias

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
Responder

03/05/2011

Emerson Nascimento

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.

Responder

03/05/2011

Luciano Farias

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;   
   
Responder

03/05/2011

Emerson Nascimento

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ê.


Responder

03/05/2011

Luciano Farias

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 ????? ***
           
Responder

03/05/2011

Emerson Nascimento

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.

Responder

04/05/2011

Luciano Farias

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
Responder

04/05/2011

Emerson Nascimento

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;


Responder

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

Aceitar