【问题标题】:SQL import CSV file with PHPSQL 使用 PHP 导入 CSV 文件
【发布时间】:2016-11-17 15:58:40
【问题描述】:

我正在尝试将一个非常大的 CSV 文件导入我的数据库(本地) 该文件为 230MB,大约 880 万行 我遇到的问题是没有打开 CSV 或不知道如何导入它, 文件打开,导入大约 500,000 行,然后它退出并且没有错误或超时或任何东西,我只是看到我的网页。

这是代码:

    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;

我来这里是为了寻求有关 stackoverflow 和 PHP 手册的帮助,我还搜索了它是否是 mysql 错误。 但我无法弄清楚, (有关使用 linux mint 18 的 mysql 设置的任何建议)

【问题讨论】:

  • 很抱歉,我没有完整的答案。我以前住过这个,最后只是输出到一个 sql 文件,将它放在服务器上并运行 mysql 来运行它。抱歉,我对此没有更多建议 :) 我没有时间找出为什么 50 万次迭代是上限...

标签: php mysql csv


【解决方案1】:

我强烈建议您使用 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 将忽略第一行,假设文件的第一行是标题行(即不是实际数据而是列标签),这将是有意义的。

【讨论】:

  • 这确实是我经常遇到的一个答案,但是如果我使用加载数据 infile,我认为我会获得拒绝 sql 注入的权限?另外添加加载本地数据文件似乎不起作用,它只是加载页面并且什么都不做:/
  • 我看不出LOAD DATA 是如何进行SQL 注入的,因为实际上没有运行任何查询。在这里查看有关如何通过 PHP 进行这项工作的一些帮助:stackoverflow.com/questions/18915104/…
  • 谢谢你的链接非常详细,我会通过 php 尝试,否则我会像控制台的答案那样做,我想这也应该工作:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2020-09-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多