[英]Data incomplete — Importing CSV-files into a PostgreSQL database using PHP
[英]Importing big CSV files to MySQL database using PHP with checking for duplicates
我希望你能幫助我。 我搜索了很多,但不幸的是沒有找到任何東西。 有什么問題? 我有1列的大型CSV文件,其中包含電子郵件地址。 單個文件中大約有50000行。 我正在創建管理面板,該面板允許使用HTML表單和PHP將這些文件導入服務器。 通過PHP將CSV導入MySQL數據庫很簡單,但是我還需要更多-檢查每個電子郵件是否存在,如果是,請跳過它。 有什么問題? 該表有大約一百萬條記錄,檢查一封電子郵件持續+/- 3秒。 50000條記錄乘以3 ...這將需要分鍾。 44小時! PHP腳本在不到10分鍾后停止響應...因此無法通過這種方式進行操作:
function doesExist($email) {
$sql = "SELECT count(*) as counter FROM mailing_subscribers WHERE subscriber_email LIKE :subscriber_email";
$sth = $this->db->prepare($sql);
$sth->execute(array(':subscriber_email' => $email));
$row = $sth->fetch();
$counter = $row->counter;
if ($counter > 0) {
return true;
} else {
return false;
}
}
function importCSV($file,$group) {
$fp = fopen($file['tmp_name'], "r");
$importsCounter = 0;
while($csv_line = fgetcsv($fp)) {
for ($i = 0, $j = count($csv_line); $i < $j; $i++) {
if (!$this->doesExist($csv_line[$i])) {
$sql = "INSERT INTO mailing_subscribers(subscriber_email,subscriber_group) VALUES('".$csv_line[$i]."','".$group."')";
$sth = $this->db->prepare($sql);
$sth->execute();
$importsCounter++;
}
}
}
$_SESSION["feedback_positive"][] = FEEDBACK_FILE_IMPORT_SUCCESSFUL . " Utworzonych wpisów: " . $importsCounter;
}
$file
是$_FILE
數組。
還有其他更快的方法嗎?
以下是我的建議:
1)在臨時表中加載您的csv文件。 參考http://dev.mysql.com/doc/refman/5.1/en/load-data.html
2)它將在幾秒鍾內非常快地加載您的批量csv數據。 現在使用插入查詢,並通過重復值檢查將數據從臨時表插入到主表中。
例如
1)假設您已在名為“ TempTable”的臨時表中加載了csv數據
2)說您的主表名稱是“ mailing_subscribers”
3)說您不想插入重復的記錄。
您的查詢將類似於:
插入到mailing_subscribers(subscriber_email,cola,colb ..)中,從TempTable中選擇“ subscriber_email,cola,colb ..”,其中“ subscriber_email”不在其中(從mailing_subscribers中選擇“ users_email”)
如果您遇到任何問題,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.