使用php将大型CSV文件导入MySQL

4

我正试图导入一个包含6万行或更多的CSV文件。但是代码只能导入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,",","'"));

2
您的整篇帖子都没有一个关于编程问题的问题。你有什么问题? - idmean
@hek2mgl同意,除非始终保证第一行。另外,我要说一下关于mysql_*已被弃用并且不应该使用的常规演讲。每次你使用那个库,Rasmus Lerdorf就会吃掉一只小猫咪。 - Zarathuztra
如果没有行,while循环就不会被执行。 - hek2mgl
@hek2mgl 没错,这就是我想说的。在这种情况下,while很好用。 - Zarathuztra
请查看我的解决方案,网址为https://dev59.com/fGMm5IYBdhLWcg3wi_m0#22744300,其中包括一些比较。 - Raza Ahmed
显示剩余4条评论
2个回答

4
你可能想要使用 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。然而,在共享托管环境中,这可能不被允许。 - hek2mgl
我应该把这个放在哪里?感谢你们所有人的回答。 :) - dardar
这将代替你代码中的 do { ... } while 循环。在 INFILE 后,你仍需要csv文件的路径本身作为参数。 - complex857
@complex857 我会尽我所能地尝试。或许,谢谢你的努力。 - dardar
@shijin,如果你使用LOCAL关键字,那么文件将由客户端读取,并且它应该可以与远程服务器一起工作(mysqld不必看到该文件)。为了使其正常工作,服务器和客户端都必须允许此操作。有关更多信息,请参阅文档中的LOCAL,其中有一个段落从中间开始。 - complex857

0

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

set_time_limit(0);

另外,将数据分块导入并在查询中插入多行而不是逐行插入也可能是一个很好的实践。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接