Laboratory of Mobile Agricultural Chemicals Searcher
携帯農薬検索実験室

研究会

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
714 / 1063 <前へ | 次へ>

〔350〕Re:テーブルの構成
 Hidemi Oya WEB  (06/06/25 3:04)

引用なし
   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.


〔327〕ACFinder 060620版 kabe (06/06/20 23:21)
〔332〕Re:ACFinder 060620版 Hidemi Oya (06/06/21 16:06)
〔333〕SQL ステートメント制限 Hidemi Oya (06/06/22 11:45)
〔335〕Re:SQL ステートメント制限 kabe (06/06/22 22:46)
〔337〕正規表現拡張構文 Hidemi Oya (06/06/23 0:56)
〔338〕Re:正規表現拡張構文 Hidemi Oya (06/06/23 13:31)
〔341〕Re:SQL ステートメント制限 s_kobayashi (06/06/23 22:02)
〔342〕「キング」対応パターン Hidemi Oya (06/06/24 0:05)
〔343〕テーブルの構成 kabe (06/06/24 1:03)
〔346〕Re:テーブルの構成 Hidemi Oya (06/06/24 12:04)
〔347〕Re:テーブルの構成 kabe (06/06/24 17:24)
〔348〕Re:テーブルの構成 Hidemi Oya (06/06/24 21:56)
〔349〕Re:テーブルの構成 kabe (06/06/24 22:29)
〔350〕Re:テーブルの構成 Hidemi Oya (06/06/25 3:04) <<<
〔352〕Re:テーブルの構成 kabe (06/06/25 15:03)
〔354〕Excel 読み込み高速化 Hidemi Oya (06/06/25 16:35)
〔355〕Re:テーブルの構成 kabe (06/06/25 16:48)
〔356〕Re:テーブルの構成 Hidemi Oya (06/06/25 18:28)
〔357〕Re:テーブルの構成 kabe (06/06/25 21:25)
〔358〕Re:テーブルの構成 Hidemi Oya (06/06/25 22:41)
〔359〕Re:テーブルの構成 Hidemi Oya (06/06/25 23:17)
〔360〕Re:テーブルの構成 kabe (06/06/26 7:03)
〔361〕Re:テーブルの構成 Hidemi Oya (06/06/26 20:53)
〔351〕Re:テーブルの構成 kabe (06/06/25 14:24)
〔353〕Re:テーブルの構成 Hidemi Oya (06/06/25 15:53)
〔344〕Re:「キング」対応パターン s_kobayashi (06/06/24 8:42)
〔345〕Re:「キング」対応パターン Hidemi Oya (06/06/24 10:58)
〔334〕ACFinder 060622版 kabe (06/06/22 22:22)
〔336〕Re:ACFinder 060622版 Hidemi Oya (06/06/23 0:04)
〔339〕Re:ACFinder 060622版 kabe (06/06/23 19:46)
〔340〕Re:ACFinder 060622版 Hidemi Oya (06/06/23 20:02)

  ツリー表示 ┃スレッド表示 ┃一覧表示 ┃トピック表示 ┃番号順表示 ┃検索  
714 / 1063 <前へ | 次へ>
ページ:  ┃  記事番号:   
(SS)C-BOARD vv3.8 is Free.