PDA

Ver la Versión Completa : Catidad de Filas de un archivo


totote
10-03-2009, 13:48:56
Hola gente del foro, estoy realizando una aplicación la cual toma cierta información de un archivo csv, y tengo que ingresarla a un TStringGrid la cantidad de columnas las conozco pero la cantidad de filas, para leer la información lo hago como archivo de texto normal, lo que quisiera saber es si hay alguna forma de conocer la cantidad de filas que tiene el archivo para así mostrar con un TProgressBar el progreso de la carga.

Este es el código que utilizo para cargar el archivo:


function CsvToStringGrid(AGrid: TStringGrid; ACSVFile: String): Boolean;
var
Archivo: TextFile;
i,j,Columnas: integer;
aux,aux2: String;
p: TfrmProgress;
begin
AssignFile(Archivo,ACSVFile);
Reset(Archivo);
Readln(Archivo,aux);
Columnas:= ContarColumnas(aux);
AGrid.ColCount:= Columnas;
p:= TfrmProgress.Create(nil);
p.pbPrincipal.Min:= 0;
// p.pbPrincipal.Max:= {?};
for i := 1 to Columnas - 1 do
AGrid.Cells[i,0]:= GetColumna(i); // Función que devuelve el título de la columna
j:= 1;
// p.Show;
while (not Eof(Archivo)) and (p.Seguir = True) do // P.Seguir es una variable tipo Boolean que cambia su estádo Con un botón Cancelar
begin
i:= 1;
AGrid.Cells[0,j]:= IntToStr(j);
while Pos(';',aux) > 0 do
begin
aux2:= Copy(aux,1,Pos(';',aux)-1);
AGrid.Cells[i,j]:= aux2;
Delete(aux,1,Pos(';',aux));
i:= i + 1;
end;
Readln(Archivo,aux);
j:= j + 1;
AGrid.RowCount:= j + 1;
// p.pbPrincipal.Position:= {?}; // Mostrar progreso
end;
p.Free;
CloseFile(Archivo);
end;


Saludos.

Caro
10-03-2009, 14:33:27
Hola totote, para saber el numero de filas directamente de la forma que estas leyendo no se puede, solo si recorres todo "while (not Eof(Archivo)).." y guardandolo en algún acumulador puedes obtenerlo osea al final, en ese caso también te serviría el StringGrid.RowCount que tienes al salir del While, pero creo que tu quieres obtenerlo antes para eso puedes utilizar un StringList y cargarlo ahí, inclusive puedes leer desde ahí.


sl := TStringList.Create;

sl.LoadFromFile('TuArchivo');
showmessage('La cantidad de líneas es: '+IntToStr(sl.Count));


Saluditos

totote
10-03-2009, 15:07:39
Caro muchas gracias me funcionó perfectamente, al final resultó más facil que de la forma en que lo estaba haciendo, ya que tomo los valores directamente del TStringList

Así quedó el código


function CsvToStringGrid(AGrid: TStringGrid; ACSVFile: String): Boolean;
var
i,j,Columnas: integer;
aux: String;
p: TfrmProgress;
sl: TStringList;
begin
Result:= False;
sl:= TStringList.Create;
sl.LoadFromFile(ACSVFile);
aux:= sl[0];
Columnas:= ContarColumnas(aux);
AGrid.ColCount:= Columnas;
p:= TfrmProgress.Create(nil);
p.pbPrincipal.Min:= 0;
p.pbPrincipal.Max:= sl.Count;
for i := 1 to Columnas - 1 do
AGrid.Cells[i,0]:= GetColumna(i); // Función que devuelve el título de la columna
j:= 0;
p.Show;
while (j < sl.Count ) and (p.Seguir = True) do // P.Seguir es una variable tipo Boolean que cambia su estádo Con un botón Cancelar
begin
i:= 1;
AGrid.Cells[0,j]:= IntToStr(j+1);
aux:= sl[j];
while Pos(';',aux) > 0 do
begin
AGrid.Cells[i,j]:= Copy(aux,1,Pos(';',aux)-1);
Delete(aux,1,Pos(';',aux));
i:= i + 1;
end;
j:= j + 1;
AGrid.RowCount:= j + 1;
Result:= True;
p.pbPrincipal.Position:= j; // Mostrar progreso
p.Caption:= 'Completado: ' + IntToStr((j * 100) div sl.Count) + '%';
end;
p.Free;
end;


Saludos y muchas gracias :D