2017-02-15 11 views
1

私のデータベースに保存したいExcelファイル(別のデータベースベースのツールからエクスポートされたもの)に20000行以上あります。MySQLで巨大なデータセットを保存し、すべての行を保存しません

if(typeof require !== 'undefined') XLSX = require('xlsx'); 

var xlsx = "tmp8704.xlsx"; 
var url = "extFiles/"+xlsx; 
var oReq = new XMLHttpRequest(); 
oReq.open("GET", url, true); 
oReq.responseType = "arraybuffer"; 
var dataXLS; 

oReq.onload = function(e) { 
var arraybuffer = oReq.response; 

/* convert data to binary string */ 
var data = new Uint8Array(arraybuffer); 
var arr = new Array(); 

for(var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]); 
var bstr = arr.join(""); 

/* Call XLSX */ 
var workbook = XLSX.read(bstr, {type:"binary"}); 
var first_sheet_name = workbook.SheetNames[0]; 
/* Get worksheet */ 
var worksheet = workbook.Sheets[first_sheet_name]; 

dataXLS = XLSX.utils.sheet_to_json(worksheet, {header:1}); 

var mysql = require("mysql"); 

var connection = mysql.createConnection({ 
    host: 'xxx.xxx.xxx.xxx', 
    user: 'muser', 
    password: 'massword', 
    database: 'matabase' 
}); 

connection.connect((err) => { 
if(err) { 
    return console.log(err.stack); 
} 
console.log("Connection succesfully established"); 
}); 

for(var x in dataXLS){ 
    if(parseInt(x)+2 != dataXLS.length) { 

     var myNumber = dataXLS[parseInt(x)+2][6]; 
     console.log("Stelle " + x + " :" + dataXLS[parseInt(x)+2][0] + " " + dataXLS[parseInt(x)+2][1] + " " + parseFloat(myNumber)); 

     $queryString = "INSERT INTO `articles` (articleno,text,price) VALUES ("+parseInt(dataXLS[parseInt(x)+2][0])+",'"+dataXLS[parseInt(x)+2][1]+"',"+parseFloat(myNumber)+");"; 


     connection.query($queryString, (err, rows, fields) => { 
     if(err) { 
      return console.log("An error ocurred with the query", err); 
     } 
     }); 

    } else { 
    console.log(parseInt(x)+2); 
    console.log(dataXLS.length); //19610 
    break; 
    } 
} 

connection.end(() => { 
    console.log("Connection successfully closed"); 
}); 
} 

oReq.send(); 

最初の質問:私のテーブルにはデータが保存されていますが、すべてのデータではありません。どうして?

2番目の質問:これを行うより効率的な方法はありますか?

+0

内部的には挿入しないでくださいが、大きな質問が1つあります。 INSERT(...)VALUES($ array [0] ['col1']、$ array [0] ['col2'])、($ array [1] ['col1']、$ array [1] [' col2 ']など)などです。 –

+0

2番目の質問に対する回答を得るために、ソリューションの「大きな図」を説明してください。データが「別のデータベースツール」(どのDBツールですか?)から来たときに、なぜソースデータベースに接続できないのですか?また、データ移行のための簡単なソリューションが必要ですか?あなたはこの仕事を頻繁に実行する必要がありますか?パフォーマンス上の理由から、 –

+0

の場合、準備されたステートメントは一般的にパフォーマンスが向上します。 1回だけ実行される移行ジョブの場合は、Excelシートから複数のINSERTステートメントを含むスクリプトを作成します。 –

答えて

0

大規模なExcelシートをMySQLにエクスポートするときに、this websiteを使用しました。 Excelファイルをcsv形式でエクスポートして、サイトの設定を多少調整する必要がありますが、高速で信頼性が高いことがわかりました。

0

ExcelのVBAマクロを実装して、Excelシートのすべてのデータの挿入ステートメントを作成できます。マクロを使用しない場合や、単にあなたがシート2

に貼り付けるすべてのデータ用シート1の挿入文を作成し、そのような

=CONCAT("INSERT INTO xxx (a,b,c) values (";Sheet2!A1;", ";Sheet2!A2);")") 

ような単純な式を定義する新しいExcelシートを定義します

(データ型に応じて、あなたはデータ列の周りに 'を追加する必要があり、いくつかのデータ型変換を挿入し、...)

は、すべてあなたの20000行のためのダウン数式をコピーし、あなたは20000個のINSERT文を取得します。代わりに、既存のレコードを更新する必要があるときにステートメントを更新するように変更することもできます。

関連する問題