【问题标题】:Importing Large CSV file in MySQL using php使用 php 在 MySQL 中导入大型 CSV 文件
【发布时间】:2014-03-15 17:48:30
【问题描述】:

我正在尝试在 CSV 文件中导入 60,000 行或更多行。该代码只能导入 5000 行。有人可以帮助我吗?

require_once('connection.php');

if ($_FILES[csv][size] > 0) {

    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");

    //loop through the csv file and insert into database
    do {
        if ($data[0]) {
            mysql_query("INSERT INTO transactions (EntryId_Pk, AccessCode, MobileNumber, TelcoCode, TIN, ORNo, ORAmt, NumOfEntries, ECN, AddedOn) VALUES
                (
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."',
                    '".addslashes($data[3])."',
                    '".addslashes($data[4])."',
                    '".addslashes($data[5])."',
                    '".addslashes($data[6])."',
                    '".addslashes($data[7])."',
                    '".addslashes($data[8])."',
                    '".addslashes($data[9])."'
                )
            ");
        }
    } while ($data = fgetcsv($handle,1000,",","'"));

【问题讨论】:

  • 你的整个帖子没有包含一个关于编程问题的问题。你有什么问题?
  • while 循环不会比do while 更好吗? ;)
  • @hek2mgl 同意,除非始终保证第一行。另外,我将给出关于 mysql_* 被弃用且不应该使用的常见说明。每次使用该库时,Rasmus Lerdorf 都会吃掉一只小猫。
  • @Zarathuztra 如果没有行,则不会输入 while 循环
  • @hek2mgl 没错,这就是我的意思。在这种情况下,while 可以正常工作。

标签: php mysql csv


【解决方案1】:

您可能想要使用LOAD DATA MySQL 语句。这可以非常快,因为您不需要将所有内容都读入 PHP 领域并让 MySQL 对分配很聪明。你可以从 PHP 中使用它:

// dont use mysql_* anymore in new code
mysqli_query($dblink, '
    LOAD DATA LOCAL INFILE "'.$file.'"
        INTO TABLE transactions
        FIELDS TERMINATED by ","
        OPTIONALLY ENCLOSED BY "\'"
        LINES TERMINATED BY "\n"
');

【讨论】:

  • 这是首选的解决方案 +1 但是,在共享主机环境中可能不允许这样做
  • 我应该把这个放在哪里?感谢您的所有回答。 :)
  • 这将替换代码中的 do { ... } while 循环。您仍然需要 csv 文件的路径本身作为 INFILE 之后的参数。
  • @complex857 我会尽我所能尝试这个。也许,谢谢你的努力。
  • @shijin,如果您使用LOCAL 关键字,则该文件由客户端读取,它应该与远程服务器一起使用(mysqld 不必见文件)。为此,服务器和客户端都必须允许这样做。查看更多关于LOCAL in the docs,中间有一个以LOCAL开头的段落。
【解决方案2】:

可能是超时错误。尝试设置

set_time_limit(0);

将数据分块导入并在查询中插入多行而不是逐行执行也是一个好习惯。

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2011-04-16
    • 2019-09-17
    • 2012-09-19
    • 2023-04-08
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多