|
kabe さん、こん**は。Hidemi Oya です。
>いや、insert into するフィールド数は逆に少なくなるので、これも少しは貢献しているかもしれません。
そうか、今までも Sheets[No].Strings[Row] で取り出したカンマテキストをそのまま INSERT 文の値として渡すんじゃなくて、ダブルクォートしたりするルーチンが入っていたので、フィールドを抜く処理を追加してもそれほど大きな影響はないんですね。それよりも、DROP TABLE と同様に INSERT するフィールド数が少ない方が書き込みが速くなる影響の方が大きいと…。
ところで、現在は Excel ファイルを見えない TStringGrid か何かに一括して保存してから SQLite に書き込んでますよね? TStringGrid や TStringList は、データ数が多くなるとだんだん遅くなるので、下記のように1行読むごとに INSERT 文を発行する方式にすれば、もっと速くなりませんかね?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, XBiff;
type
TForm1 = class(TForm)
XBiff1: TXBiff;
Button1: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
procedure XBiff1Progress(Sender: TObject; Progress: Integer);
procedure XBiff1ReadCell(Sender: TObject; SheetNo, Row, Col,
rgbAttr: Integer; Data: String; var Cancel: Boolean);
procedure XBiff1ReadSheetName(Sender: TObject; SheetName: String);
private { Private 宣言 }
FValidSheet: boolean;
FRow: TStringList;
procedure InsertRow;
public { Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function HanToZen(s: string): string;
begin
// 実際には変換ルーチンが入る
Result := s;
end;
procedure TForm1.InsertRow;
var
sql: string;
begin
if FRow.Text = '' then Exit;
sql := 'INSERT INTO tekiyo VALUES(' + FRow.DelimitedText + ')';
FRow.Clear;
// ここで SQLite に INSERT 文発行
end;
// Excel ファイル読み込み&SQLiteに保存
procedure TForm1.Button1Click(Sender: TObject);
begin
FRow := TStringList.Create;
try
FRow.QuoteChar := '''';
ProgressBar1.Position := 0;
XBiff1.LoadFile('test.xls');
InsertRow; // 最後の行を保存
finally
FRow.Free;
end;
end;
procedure TForm1.XBiff1Progress(Sender: TObject; Progress: Integer);
begin
ProgressBar1.Position := Progress;
end;
procedure TForm1.XBiff1ReadSheetName(Sender: TObject; SheetName: String);
begin
FValidSheet := SheetName = '登録適用部';
end;
procedure TForm1.XBiff1ReadCell(Sender: TObject; SheetNo, Row, Col,
rgbAttr: Integer; Data: String; var Cancel: Boolean);
begin
if not FValidSheet then Exit;
if Row = 0 then Exit;
case Col of
5..8, 13, 18: FRow.Strings[Col - 4] := AnsiToUtf8(AnsiQuotedStr(HanToZen(Data), '"'));
9..12, 14..17: FRow.Strings[Col - 4] := AnsiToUtf8(AnsiQuotedStr(Data, '"'));
20..24: FRow.Strings[Col - 5] := AnsiToUtf8(AnsiQuotedStr(Data, '"'));
0: begin
InsertRow; // 前の行を保存
FRow.DelimitedText := Data + ',"","","","","","","","","","","","","","","","","","",""';
end;
end;
end;
end.
|
|