Ver Mensaje Individual
  #1  
Antiguo 18-06-2012
ErYcK ErYcK is offline
Miembro
NULL
 
Registrado: abr 2012
Posts: 26
Reputación: 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