Und direkt in ein Grid geht es z.B. so...
Delphi-Quellcode:
procedure CSVtoStringGrid(Dateiname:string; StringGrid:TStringGrid);
var Datei:textfile;
Zeilen, posi, ErsteZeile, ErsteSpalte, x, xmax, y, Breite:integer;
Spalte, Zeile, s:string;
begin
if assigned(StringGrid) then begin
ErsteZeile:=StringGrid.FixedRows;
ErsteSpalte:=StringGrid.FixedCols;
StringGrid.RowCount:=StringGrid.FixedRows+1;
Zeilen:=StringGrid.RowCount-1;
Breite:=StringGrid.ColCount-1;
y:=ErsteZeile;
xmax:=0;
assignfile(Datei, Dateiname);
try
reset(Datei);
while not eof(Datei) do begin
readln(Datei, Zeile);
if y > Zeilen then begin
StringGrid.RowCount:=StringGrid.RowCount+1;
Zeilen:=StringGrid.RowCount-1;
end;
Zeile:=Zeile+';';
s:=Zeile;
x:=ErsteSpalte;
repeat
posi:=pos(';', Zeile);
if posi > 0 then
Spalte:=copy(Zeile, 1, posi-1);
delete(Zeile, 1, posi);
if x > Breite then begin
StringGrid.ColCount:=StringGrid.ColCount+1;
Breite:=StringGrid.ColCount-1;
end;
StringGrid.Cells[x, y]:=Spalte;
inc(x);
if x > xmax then
xmax:=x;
until (posi = 0) or (Zeile = '');
inc(y);
end;
if StringGrid.RowCount > y then
StringGrid.RowCount:=StringGrid.RowCount - (StringGrid.RowCount - y);
if StringGrid.ColCount > xmax then
StringGrid.ColCount:=StringGrid.ColCount - (StringGrid.ColCount - xmax);
finally
closefile(Datei);
end;
end;
end;
Aufruf...
CSVtoStringGrid('Mappe.csv', StringGrid);
Test: ~23MB / 17000 Zeilen, 256 Spalten in 23 Sekunden.
Das Einlesen und erstellen des Gridbereiches dauert eigentlich nur 5 Sekunden (so schnell ist bei mir auch Excel), wurde allerdings auf 23 Sekunden erhöht, durch den Zugriff auf Cells. Da das alles
private Elemente im Grid sind, die da aufgerufen werden konnte ich da leider noch keine weitere Optimierung einbauen.
Auch das Umschalten der Zeichenroutine oder das unsichbarmachen des Grids ergab keinen Geschwindigkeitszuwachs.
Edit:
Der Ansatz von
Amateurprofi ist sogar noch etwas schneller (~19 Sekunden), allerdings wird die letzte Spalte nicht mit importiert (c mit 1 initialisieren, dann gehts)
Gruss
Thorsten