2016-11-17 159 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