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.