2016-11-17 113 views
1

我試圖導入一個相當大的CSV文件到我的數據庫(本地) 該文件是230MB和它的約880萬行 我的問題是不打開CSV或不要知道如何導入它, 文件打開,導入大約500,000行,然後退出並且不會出現錯誤或超時或任何事情,我只能看到我的網頁。PHP導入CSV文件

這是代碼:

try { 
    $conn = new PDO("mysql:host=$servername;dbname=adresses_database", $username, $password); 
    // set the PDO error mode to exception 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    echo "Connected successfully"; 
    $row = 1; 
if (($handle = fopen("bagadres.csv", "c+")) !== FALSE) { 
    while (($data = fgetcsv($handle, '', ";")) !== FALSE) { 
     if (!isset($write_position)) {  // move the line to previous position, except the first line 
       $write_position = 0; 
     $num = count($data); // $num is 15 
     $row++; //i dont need this? 
     $stmt = $conn->prepare("INSERT INTO adresses (openbareruimte, huisnummer, huisletter, huisnummertoevoeging, postcode, woonplaats, gemeente, provincie, object_id, object_type, nevenadres, x, y, lon, lat) VALUES (:openbareruimte, :huisnummer, :huisletter, :huisnummertoevoeging, :postcode, :woonplaats, :gemeente, :provincie, :object_id, :object_type, :nevenadres, :x, :y, :lon, :lat)"); 
     $stmt->bindParam(':openbareruimte', $data[0]); 
     $stmt->bindParam(':huisnummer', $data[1]); 
     $stmt->bindParam(':huisletter', $data[2]); 
     $stmt->bindParam(':huisnummertoevoeging', $data[3]); 
     $stmt->bindParam(':postcode', $data[4]); 
     $stmt->bindParam(':woonplaats', $data[5]); 
     $stmt->bindParam(':gemeente', $data[6]); 
     $stmt->bindParam(':provincie', $data[7]); 
     $stmt->bindParam(':object_id', $data[8]); 
     $stmt->bindParam(':object_type', $data[9]); 
     $stmt->bindParam(':nevenadres', $data[10]); 
     $stmt->bindParam(':x', $data[11]); 
     $stmt->bindParam(':y', $data[12]); 
     $stmt->bindParam(':lon', $data[13]); 
     $stmt->bindParam(':lat', $data[14]); 
    $stmt->execute(); 
} else { 
       $read_position = ftell($handle); // get actual line 
       fseek($handle, $write_position); // move to previous position 
       fputs($handle, $line);   // put actual line in previous position 
       fseek($handle, $read_position); // return to actual position 
       $write_position += strlen($line); // set write position to the next loop 
      } 
      fflush($handle);       // write any pending change to file 
     ftruncate($handle, $write_position);  // drop the repeated last line 
     flock($handle, LOCK_UN); 
    } 
    fclose($handle); 
} 
    } 
catch(PDOException $e) 
    { 
    echo "Connection failed: " . $e->getMessage(); 
    } 

$conn = null; 

我來到這麼遠尋找的計算器和PHP手冊的幫助,我也搜查,如果它是一個MySQL錯誤。 但我不明白這一點, (有關MySQL的設置有什麼建議即時通訊使用Linux Mint的18)

+0

對不起,我沒有一個完整的答案給你。我以前住過這個,最後只是輸出到一個sql文件,將它放到服務器上並運行mysql來運行它。對不起,我沒有更多的建議:)我沒有時間找出爲什麼五十萬次迭代是一個上限...... –

回答

6

我強烈建議你使用MySQL的LOAD DATA INFILE,這可能是最快,最有效的得到CSV數據成MySQL表。爲你設置的命令會是這樣的:

LOAD DATA INFILE 'bagadres.csv' 
INTO TABLE adresses 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 

如果你的字段沒有加引號,或者比其他報價東西被封閉,然後刪除或修改ENCLOSED BY條款。另外,IGNORE 1 ROWS將忽略第一行,假設文件的第一行是標題行(即不是實際數據,而是列標籤),這將有意義。

+0

這確實是我經常遇到的答案,但如果我使用加載數據infile我得到一個權限被拒絕來反擊sql注入我認爲?同時添加加載本地數據infile似乎沒有工作,它只是加載頁面,並什麼也不做:/ – Jesse

+0

我不明白SQL Anywhere注入是如何可能與'LOAD DATA',因爲沒有查詢實際上正在運行。看看這裏的一些關於如何使這項工作從PHP的幫助:http://stackoverflow.com/questions/18915104/php-import-csv-file-to-mysql-database-using-load-data-infile –

+0

謝謝你的鏈接是相當詳細的,我會嘗試通過PHP,否則我會做這樣的控制檯的答案,這應該工作太我想:) – Jesse