2011-06-24 17 views
1

MySQLベースに大きなxls-fileをインポートする必要があります。私は "LOAD DATA INFILE"構造を使用しようとしています。 xlsのデータにはキリル文字が含まれているため、いくつか問題があります。私は手動でダンプファイルを作成しますが、 "LOAD DATA INFILE"はキリル文字をロードしません。 MySQLの命令 "SELECT ... INTO OUTFILE"は完璧ですが、 "SELECT ... INTO OUTFILE"からバイナリキャラクタセットでファイルを保存する必要があるため、使用できません。Delphiとバイナリ文字セット(MySQL用)

マイコード:

procedure TfmImportGoods.btnImportClick(Sender: TObject); 
var 
    sToFile: TStringStream; 
    sTemp: AnsiString; 

    function FixString(s: String): String; 
    begin 
    Result := s; 
    Result := SysUtils.StringReplace(Result, #10, '', [rfReplaceAll]); 
    Result := SysUtils.StringReplace(Result, #13, '', [rfReplaceAll]); 
    end; 

begin 
    fmMain.MyScript.SQL.Text := 'TRUNCATE TABLE goods'; 
    fmMain.MyScript.Execute; 

    adoImport.Close; 
    adoImport.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ 
    fmMain.dlgOpenGoods.FileName+ 
    ';Mode=ReadWrite|Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=False'; 

    adoImport.SQL.Text := 'SELECT * FROM ['+lbTables.Items[0]+']'; 
    adoImport.Open; 

    sTemp := ''; 
    try 
    while not adoImport.Eof do 
    begin 
     sTemp := sTemp + 
     #9+adoImport.FieldByName('Код').AsString+#9+ 
     adoImport.FieldByName('Производитель').AsString+#9+ 
     adoImport.FieldByName('Модель').AsString+#9+ 
     adoImport.FieldByName('Артикул').AsString+#9+ 
     FixString(adoImport.FieldByName('Описание').AsString)+#9+ 
     adoImport.FieldByName('Кол-во').AsString+#9+ 
     //TODO: проверить 
     {SysUtils.StringReplace(
      adoImport.FieldByName('Розн#цена').AsString), ',', '.', [rfReplaceAll]),} 
     adoImport.FieldByName('Розн#цена').AsString+#9+ 
     adoImport.FieldByName('Информация').AsString+#9+ 
     adoImport.FieldByName('Гарантия').AsString+#10; 
     adoImport.Next; 
    end; 

    sToFile := TStringStream.Create(sTemp, 1252); 
    sToFile.SaveToFile(ExtractFilePath(Application.ExeName)+'import.txt'); 

    fmMain.MyScript.SQL.Text := 'LOAD DATA INFILE '''+ 
    fmMain.ScreenSpecs(ExtractFilePath(Application.ExeName)+'import.txt')+''' INTO TABLE goods'; 
    fmMain.MyScript.Execute; 

    ShowMessage('Новый список товаров был успешно импортирован!'); 
    finally 
    sToFile.Free; 
    end; 
end; 

私が知っているMySQLが作成するファイル、およびデルファイにより、このようなファイルを作成するために必要なもの。 MySQLのヘルプでは、このエンコーディングは「バイナリ文字セット」と呼ばれています。だから、このエンコーディングでファイルをDelphiでどのように保存できますか?

答えて

1

load data infileキリル文字が正しく読み込まれます。

読み込んでいるcsvファイルがユニコードを使用していて、文字が正しく表示されていることを確認してください。
読み取っているデータベースフィールドに適切なエンコーディングが設定されていることを確認してください。私はキリル文字の照合でUTF8を提案します。

次に、データベース接続(!)でUTF8が使用されていることを確認してください。そうしないと、トランスポートで文字が変更されます。

これとload data infileはうまくいくはずです。

キリル文字のデータをMySQLに読み込む方法は次のとおりです。Howto import a UTF8 textbook (book) in MySQL table/A simple step by step guide through on howto import books in MySQL