Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-06-2012
ErYcK ErYcK is offline
Miembro
NULL
 
Registrado: abr 2012
Posts: 26
Poder: 0
ErYcK Va por buen camino
Lentitud leer .csv

Mi problema es el siguiente:

Leo un archivo csv. en un RichEdit, lo leo con este componente porque con un Memo me paso del límite de caracteres.

Después de leerlo lo cargo en un StringGrid y comparo los datos con una base de datos en busca de nuevos registros.

El problema esta en la lentitud del proceso de lectura del .csv, no se me ocurre forma de acelerar este proceso ya que tengo que tener en cuenta:
-Que cuando haya mas de un espacio seguido deje de leer la linea del RichEdit.
-Que cuando encuentre un ";" debe meter la variable en la celda del StringGrid.
-Que cuando encuentre algo que no sea ";" rellene la variable con la palabra encontrada.

Mi código es el siguiente, si alguien tiene alguna idea de como podría acelerar el proceso seria de gran ayuda.

Código:
void __fastcall TXPrincipal::ToolButton2Click(TObject *Sender)
{

         if(OpenDialog1->Execute())
        {
               //LECTURA DE CSV
                int col =0;
                int cont=0;
                String referencia ="";
                RichEdit1->Lines->LoadFromFile(OpenDialog1->FileName);
                XCarga->Show();
                XCarga->Caption="Leiendo .CSV...";
                XCarga->ProgressBar1->Min = 0;
                XCarga->ProgressBar1->Max = RichEdit1->Lines->Count;
                for (int i =0; i <= RichEdit1->Lines->Count; i++)
                {
                        XCarga->ProgressBar1->Position = i;
                        col=0;
                        cont=0;
                        for (int j=1; j<= RichEdit1->Lines->Strings[i].Length();j++)
                        {
                                XCarga->Caption="Leiendo .CSV...Linea: "+ IntToStr(i)+ "Columna: "+ IntToStr(j);
                                if (RichEdit1->Lines->Strings[i][j] != ' ')
                                {
                                        cont =0;
                                        if (RichEdit1->Lines->Strings[i][j] == ';')
                                        {
                                        StringGrid1->Cells[col][i] = referencia;
                                        referencia = "";
                                        col++;
                                        }
                                        if (RichEdit1->Lines->Strings[i][j] != ';')
                                        {
                                        referencia = referencia +RichEdit1->Lines->Strings[i][j];
                                        }
                                }
                                if (RichEdit1->Lines->Strings[i][j] == ' ')
                                {
                                        cont++;
                                        if (cont >2)
                                                break;
                                }
                        }

                }

        //COMPARAR CON BD
        XCarga->Close();
        }

        XDatos->TCategorias->Open();
        XDatos->TSubCat1->Open();
        XDatos->TSubCat2->Open();
        XDatos->TSubCat3->Open();
        XDatos->TMarcas->Open();
        XCarga->Close();
        XDatos->TCaracteristicas->Open();
        int cont=0;
        XCarga->Show();
        XCarga->ProgressBar1->Min = 1;
        XCarga->ProgressBar1->Max = RichEdit1->Lines->Count;
        String ref = "";
        for (int f=1;f<=StringGrid1->RowCount;f++)
        {
            if (StringGrid1->Cells[0][f]!="")
            {
            ref = StringGrid1->Cells[0][f];

            XCarga->Caption = IntToStr(f)+ " Productos Nuevos";
            XCarga->ProgressBar1->Position = f;
            XDatos->QExisteProducto->Close();
            XDatos->QExisteProducto->Parameters->ParamByName("PRef")->Value = ref;
            XDatos->QExisteProducto->Open();
            if (XDatos->QExisteProducto->FieldByName("existe")->Value ==0)
            {
                        String categoria ="";
                        XDatos->QProductos->Append();
                        XDatos->QProductosREFERENCIA->Value = StringGrid1->Cells[0][f];
                        XDatos->QProductosESTADO->Value = StringGrid1->Cells[1][f];
                        categoria = StringGrid1->Cells[2][f];
                        XDatos->QExisteCategoria->Close();
                        XDatos->QExisteCategoria->Parameters->ParamByName("PCat")->Value = categoria ;
                        XDatos->QExisteCategoria->Open();
                        if (XDatos->QExisteCategoria->FieldByName("Existe")->Value >0)
                        {
                                XDatos->QCodigoCategoria->Close();
                                XDatos->QCodigoCategoria->SQL->Text = "select * from categorias where categoria = :PCat";
                                XDatos->QCodigoCategoria->Parameters->ParamByName("PCat")->Value = categoria;
                                XDatos->QCodigoCategoria->Open();
                                XDatos->QProductosCATEGORIA->Value = XDatos->QCodigoCategoriaCodCategoria->Value;
                                XDatos->QCodigoCategoria->Close();
                        }
                        else
                        {
                                XDatos->TCategorias->Append();
                                XDatos->TCategoriasCATEGORIA->Value = StringGrid1->Cells[2][f];
                                XDatos->TCategorias->Post();
                                XDatos->QProductosCATEGORIA->Value=XDatos->TCategoriasCodCategoria->Value;
                        }
                        String subcat1 =StringGrid1->Cells[3][f];
                        XDatos->QExisteSubcat1->Close();
                        XDatos->QExisteSubcat1->Parameters->ParamByName("PSubCat1")->Value = subcat1;
                        XDatos->QExisteSubcat1->Open();
                        if (XDatos->QExisteSubcat1->FieldByName("Existe")->Value >0)
                        {
                                XDatos->QCodigoSubCat1->Close();
                                XDatos->QCodigoSubCat1->SQL->Text = "select * from SUBCATS1 where SUBCAT1 = :PSubcat1";
                                XDatos->QCodigoSubCat1->Parameters->ParamByName("PSubcat1")->Value = subcat1;
                                XDatos->QCodigoSubCat1->Open();
                                XDatos->QProductosSUBCAT1->Value = XDatos->QCodigoSubCat1CodSUBCAT1->Value;
                                XDatos->QCodigoSubCat1->Close();
                        }
                        else
                        {
                                XDatos->TSubCat1->Append();
                                XDatos->TSubCat1SUBCAT1->Value = StringGrid1->Cells[3][f];
                                XDatos->TSubCat1CATEGORIA->Value = XDatos->QProductosCATEGORIA->Value;
                                XDatos->TSubCat1->Post();
                                XDatos->QProductosSUBCAT1->Value= XDatos->TSubCat1CodSUBCAT1->Value;
                        }
                        String subcat2 =StringGrid1->Cells[4][f];
                        XDatos->QExisteSubcat2->Close();
                        XDatos->QExisteSubcat2->Parameters->ParamByName("PSubCat2")->Value = subcat2;
                        XDatos->QExisteSubcat2->Open();
                        if (XDatos->QExisteSubcat2->FieldByName("Existe")->Value >0)
                        {
                                XDatos->QCodigoSubCat2->Close();
                                XDatos->QCodigoSubCat2->SQL->Text = "select * from SUBCATS2 where SUBCAT2 = :PSubcat2";
                                XDatos->QCodigoSubCat2->Parameters->ParamByName("PSubcat2")->Value = subcat2;
                                XDatos->QCodigoSubCat2->Open();
                                XDatos->QProductosSUBCAT2->Value = XDatos->QCodigoSubCat2CodSUBCAT2->Value;
                                XDatos->QCodigoSubCat2->Close();
                        }
                        else
                        {
                                XDatos->TSubCat2->Append();
                                XDatos->TSubCat2SUBCAT2->Value = StringGrid1->Cells[4][f];
                                XDatos->TSubCat2SUBCAT1->Value = XDatos->QProductosSUBCAT1->Value;
                                XDatos->TSubCat2->Post();
                                XDatos->QProductosSUBCAT2->Value = XDatos->TSubCat2CodSUBCAT2->Value;
                        }
                        String subcat3 =StringGrid1->Cells[5][f];
                        XDatos->QExisteSubcat3->Close();
                        XDatos->QExisteSubcat3->Parameters->ParamByName("PSubCat3")->Value = subcat3;
                        XDatos->QExisteSubcat3->Open();
                        if (XDatos->QExisteSubcat3->FieldByName("Existe")->Value >0)
                        {
                                XDatos->QCodigoSubcat3->Close();
                                XDatos->QCodigoSubcat3->SQL->Text = "select * from SUBCATS3 where SUBCAT3 = :PSubcat3";
                                XDatos->QCodigoSubcat3->Parameters->ParamByName("PSubcat3")->Value = subcat3;
                                XDatos->QCodigoSubcat3->Open();
                                XDatos->QProductosSUBCAT3->Value = XDatos->QCodigoSubcat3CodSUBCAT3->Value;
                                XDatos->QCodigoSubcat3->Close();
                        }
                        else
                        {
                                XDatos->TSubCat3->Append();
                                XDatos->TSubCat3SUBCAT3->Value = StringGrid1->Cells[5][f];
                                XDatos->TSubCat3SUBCAT2->Value = XDatos->QProductosSUBCAT2->Value;
                                XDatos->TSubCat3->Post();
                                XDatos->QProductosSUBCAT3->Value = XDatos->TSubCat3CodSUBCAT3->Value;

                        }
                        XDatos->QProductosPRODUCTO->Value = StringGrid1->Cells[6][f];
                        XDatos->QProductosKEY->Value = StringGrid1->Cells[7][f];

                        String marca =StringGrid1->Cells[8][f];
                        XDatos->QExisteMarca->Close();
                        XDatos->QExisteMarca->Parameters->ParamByName("PMarca")->Value = marca;
                        XDatos->QExisteMarca->Open();
                        if (XDatos->QExisteMarca->FieldByName("Existe")->Value >0)
                        {
                                XDatos->QCodigoMarca->Close();
                                XDatos->QCodigoMarca->SQL->Text = "select * from MARCAS where MARCA = :PMarca";
                                XDatos->QCodigoMarca->Parameters->ParamByName("PMarca")->Value = marca;
                                XDatos->QCodigoMarca->Open();
                                XDatos->QProductosMARCA->Value = XDatos->QCodigoMarcaCodMARCA->Value;
                                XDatos->QCodigoMarca->Close();
                        }
                        else
                        {
                                XDatos->TMarcas->Append();
                                XDatos->TMarcasMARCA->Value = StringGrid1->Cells[8][f];
                                XDatos->TMarcas->Post();
                                XDatos->QProductosMARCA->Value = XDatos->TMarcasCodMARCA->Value;
                        }
                        XDatos->QProductosDESCRIPCION->Value = StringGrid1->Cells[9][f];
                        XDatos->QProductosFOTOS->Value = StringGrid1->Cells[10][f];
                        XDatos->QProductosCATEGORIAX->Value = StringGrid1->Cells[11][f];
                        XDatos->QProductosCATEGORIAS->Value = StringGrid1->Cells[12][f];
                        XDatos->QProductos->Post();
                        for(int c=13;c<=StringGrid1->ColCount;c++)
                        {
                                if (StringGrid1->Cells[c][f]!="")
                                {
                                        if (c % 2 !=0)
                                        {
                                        XDatos->TCaracteristicas->Append();
                                        XDatos->TCaracteristicasCATEGORIA->Value = XDatos->QProductosCATEGORIA->Value;
                                        XDatos->TCaracteristicasSUBCAT1->Value = XDatos->QProductosSUBCAT1->Value;
                                        XDatos->TCaracteristicasSUBCAT2->Value = XDatos->QProductosSUBCAT2->Value;
                                        XDatos->TCaracteristicasSUBCAT3->Value = XDatos->QProductosSUBCAT3->Value;
                                        XDatos->TCaracteristicasref->Value = XDatos->QProductosREFERENCIA->Value;
                                        XDatos->TCaracteristicasCARACTERISTICA->Value = StringGrid1->Cells[c][f];
                                        XDatos->TCaracteristicasVALOR->Value = StringGrid1->Cells[c+1][f];
                                        XDatos->TCaracteristicas->Post();
                                        }
                                }
                        }

             if (StringGrid1->Cells[0][f]=="")
                        cont ++;
             if (cont > 100)
                        break;
             }
             }
        }
        XCarga->Close();
        XDatos->QRecorreProductos->Close();
        DBGrid1->Refresh();

}
Gracias de antemano por vuestra atención.

Un Saludo.
Responder Con Cita
  #2  
Antiguo 18-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Una pregunta, si quieres leer un fichero y mostrarlo en un stringgrid, ¿por qué lo cargas en el richedit de intermediario?
Responder Con Cita
  #3  
Antiguo 18-06-2012
ErYcK ErYcK is offline
Miembro
NULL
 
Registrado: abr 2012
Posts: 26
Poder: 0
ErYcK Va por buen camino
Pues en principio lo hice por comodidad, ya que con el LoadFromFile ya leo perfectamente el csv teniendo en cuenta los saltos de linea, y me coloca 1 registro por linea en el RichEdit, lo cual facilita luego la lectura para el StringGrid.

Piensas que la lentitud es a causa de leer el RichEdit? quizás leyendo directamente desde el archivo puede ser mas rápido?
Si es asi como crees que podria leer desde el archivo caracter a caracter para tener en cuenta las mismas cosas?

Gracias por tu interes
Responder Con Cita
  #4  
Antiguo 18-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola ErYcK.

Si no entendí mal lo que deseas hacer, se me ocurre que podrías cambiar el separador ';' por ',' y aprovechar la propiedad CommaText del TStringGrid.

Fijate si de este modo hace mas rápido lo que buscas:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender) {
TStringList *TS = new TStringList;
TStringGrid *SG = static_cast<TStringGrid*> (StringGrid1);

 if (OpenDialog1->Execute()) {
   TS->LoadFromFile(OpenDialog1->FileName);
   for(int i=0; i< TS->Count; i++) {
     StringReplace(TS->Strings[i], ';', ',', TReplaceFlags() << rfReplaceAll);
     SG->Rows[i]->CommaText = TS->Strings[i];
   }
 }
 delete TS;
}
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 19-06-2012
ErYcK ErYcK is offline
Miembro
NULL
 
Registrado: abr 2012
Posts: 26
Poder: 0
ErYcK Va por buen camino
Gracias por tu aporte ecfisa, el problema es que algunos campos llevan ',' entonces necesito el ';' como separador, sino me crearía conflictos.
Por ejemplo hay un campo fotos en el cual hay 6 nombres de fotos separados con ',' entonces me metería 6 campos distintos donde debe ser solo uno.
Este mismo proceso lo hice en principio utilizando el componente Memo, y lo hacia más rápido pero me vi obligado a cambiarlo porque llegara el límite de caracteres del Memo, no termino de entender porque con el RichEdit se ralentiza tanto, en principio pensé que el problema estaba en que siempre recorría al completo los campos del RichEdit y de por ese motivo utilice el contador para que una vez encuentre 2 espacios seguidos me me salga del bucle, pero no consigo acelerarlo suficiente con eso.

De nuevo gracias por vuestra atención.
Responder Con Cita
  #6  
Antiguo 19-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola ErYcK.

A ver, proba si te sirve de este modo:
Código:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if (OpenDialog1->Execute()) {
    TStringList *TS = new TStringList;
    TS->LoadFromFile(OpenDialog1->FileName);
    for(int i=0; i< TS->Count; i++)
      ExtractStrings(TSysCharSet()<< ';', TSysCharSet() << ' ',
        TS->Strings[i].c_str(), StringGrid1->Rows[i]);
    delete TS;
  }
}
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Lentitud en ADO JF Sebastian Conexión con bases de datos 0 16-03-2008 11:06:26
Lentitud Firebird mjjj Conexión con bases de datos 16 13-01-2008 17:35:06
Lentitud en la red. Carlos Arevalo Varios 2 09-07-2007 19:04:08
Lentitud en la red Ignacio Conexión con bases de datos 2 26-08-2003 14:09:39


La franja horaria es GMT +2. Ahora son las 17:18:48.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi