Desmembramento de txt

Esse Tópico é reservado para Discussões sobre Delphi Em Geral
anderbelluno
Mensagens: 24
Registrado em: Sáb Set 23, 2017 11:53 am

Desmembramento de txt

Mensagem por anderbelluno » Qua Jan 24, 2018 5:12 pm

pessoal,
vim aqui no forum pra nao enxer linguiça no Skype, kkkkkkkkkkkkkkkkkkk

preciso melhorar o desempenho para desmembrar um arquivo de texto que ta ficando cada vez maior.
preciso analizar cada linha e inserir no db caso nao existe ainda.
hj o arquivo tem mediamente 10.000 linhas e demora cerca de 7 minutos para fazer todas as operações.

Código: Selecionar todos

procedure TfrmImportazioni.btnAggiornaFilmClick(Sender: TObject);
var
  f: textfile;
  slinha,progressivo,sData, txtUpDate,ClasseProg, ClasseNoleggio, xqry, newPROG,vError: string;
  sl: TStringList;
  i, l, oldPROG: integer;
  day,month,year: Word;
  xData:TDateTime;
  qryClasseMag, qry: TRESTDWClientSQL;

begin
 frmMessaggio.Show;
 frmMessaggio.Update;

 // chamo a procedure para apagar a primeira linha caso existir o  "V3CLEUNIK"
  deletarlinha(DBFILM,0,';V3CLEUNIK');
  AssignFile(f, DBFILM);
  Reset(f);

  sl := TStringList.Create;
  l := 0;
  qryClasseMag:= TRESTDWClientSQL.Create(nil);
  qryClasseMag.Database:= DMPrincipal.DWDataBase;

  qry:= TRESTDWClientSQL.Create(nil);
  qry.Database:= DMPrincipal.DWDataBase;

  IBDataFilm.Open;
  IBDataFilm.RebuildMassiveDataset;

  while not Eof(f) do
  begin
    Readln(f, sLinha);
    inc(l);

    sl.Clear;
    // desmembra a linha, "gerando" as colunas
    while slinha <> '' do
    begin
      i := pos(#9, slinha);
      if i > 0 then
      begin
        sl.Add(copy(slinha, 1, i-1));
        slinha := copy(slinha, i+1, length(slinha));
      end
      else
      begin
        sl.Add(slinha);
        slinha := '';
      end;
    end;

   progressivo:= sl[0];

    sData:= sl[52];
    sData:= Copy(sData,1,4);
    year:= StrToInt(sData);

    sData:= sl[52];
    sData:= Copy(sData,5,2);
    month:= StrToInt(sData);

    sData:= sl[52];
    sData:= Copy(sData,7);
    day:= StrToInt(sData);

    xData:= EncodeDate(year,month,day);

    ClasseProg:= Copy(sl[2],0,1);

     if ((ClasseProg[1] in ['0'..'9']) or (IsCharEspec(ClasseProg[1])))then
      begin
      ClasseProg:= '0';
      end;

   //**** verifico se tem o filme
     xqry:= 'select * from TD_DB_FILM where COD_FILM LIKE ';
     xqry:= xqry + #39 + '%' + Copy(sl[1],4,13) + '%' + #39;
     qry.Close;
     qry.SQL.Clear;
     qry.SQL.Add(xqry);
     qry.Open;
     qry.First;
     qry.Last;

     // se tem o film copio a classe e progressivo
    if (qry.RecordCount > 0) then
    begin
     newPROG:= Copy(qry.FieldByName('COD_MAGAZZINO').AsAnsiString,2);
     ClasseNoleggio:=  qry.FieldByName('CLASSE_NOLEGGIO').AsAnsiString;

     end
     else
     begin
     qryClasseMag.Close;
     qryClasseMag.SQL.Clear;
     qryClasseMag.SQL.Add('select * from TB_CLASSE_MAGAZZINO where CLASSE = :CLASSE');
     qryClasseMag.ParamByName('CLASSE').Value:= ClasseProg;
     qryClasseMag.Open;
     oldPROG:= qryClasseMag.Fields[2].AsInteger;
     newPROG:= IntToStr(oldPROG + 1);
     ClasseNoleggio:= sl[8];

        txtUpDate:= ' update TB_CLASSE_MAGAZZINO set PROG ='+newPROG;
        txtUpDate:= txtUpDate + ' where id = ' + #39 + IntToStr(qryClasseMag.Fields[0].AsInteger) + #39;
        qryClasseMag.Close;
        qryClasseMag.SQL.Clear;
        qryClasseMag.SQL.Add(txtUpDate);
        qryClasseMag.UpdateTableName:= 'TB_CLASSE_MAGAZZINO';

       if not (qryClasseMag.ExecSQL(vError)) then
        begin
            MessageDlg(vError, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0);
        end;

     end;

     qry.Close;
     qry.SQL.Clear;
     qry.SQL.Add('select PROGRESSIVO from TD_DB_FILM where PROGRESSIVO = :PROGRESSIVO');
     qry.ParamByName('PROGRESSIVO').AsInteger:= StrToInt(progressivo);
     qry.Open;

      if (qry.FieldByName('PROGRESSIVO').AsInteger <> StrToInt(progressivo)) then
       begin

        IBDataFilm.Append;

        IBDataFilmPROGRESSIVO.AsInteger:= StrToInt(progressivo);
        IBDataFilmCOD_FILM.AsAnsiString:= sl[1];
        IBDataFilmTITOLO_FILM.AsAnsiString:= sl[2];
        IBDataFilmCLASSE_NOLEGGIO.AsAnsiString:= ClasseNoleggio;//sl[8];
        IBDataFilmDT_ACQUISTO.AsDateTime:= xData;

        IBDataFilmCOD_MAGAZZINO.Value:= ClasseProg + newProg;
        IBDataFilmDISPONIBILE.AsansiString:= 'S';

        IBDataFilm.Post;

          If Not IBDataFilm.ApplyUpdates(vError) Then
            MessageDlg(vError, TMsgDlgType.mtError, [TMsgDlgBtn.mbOK], 0);

       end;
      IBDataFilm.Next;
  end;
  CloseFile(f);
  sl.Free;
  frmMessaggio.close;
  Application.ProcessMessages;
end;
Os componente são todos DW, mantive os Nomes dos componentes antigos pra nao perder tempo, kkkkkkkkkkkkkkkkkkk
Espero de ter explicado bem.

Avatar do usuário
XyberX
Site Admin
Mensagens: 339
Registrado em: Sáb Jul 15, 2017 2:24 pm

Re: Desmembramento de txt

Mensagem por XyberX » Qua Jan 24, 2018 5:38 pm

Seu problema esta no seu update
que esta rodando linha a linha e etc
cria um massive cache e manda via massive, ai vai tudo de uma vez
e não linha a linha.

anderbelluno
Mensagens: 24
Registrado em: Sáb Set 23, 2017 11:53 am

Re: Desmembramento de txt

Mensagem por anderbelluno » Qua Jan 24, 2018 8:28 pm

Giberto,
como disse no Skype,
mesmo sem passar pelo post ou mesmo pelo applyupdates
demora de mais, meu medo é que esse arquivo vai continuar crescendo e
vai demorar cada vez mais.
sera que existe outra forma para melhorar essa leitura.

Avatar do usuário
XyberX
Site Admin
Mensagens: 339
Registrado em: Sáb Jul 15, 2017 2:24 pm

Re: Desmembramento de txt

Mensagem por XyberX » Qua Jan 24, 2018 9:51 pm

Show vamos ver algo para gravar em tlist em memoria dpois juntar tudo pq acessar o dado todas as vezes gera repetição de acessos e isso realmente deixa mais lento.

Responder

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante