php - 解析 CSV 并导入到 PHP 很慢

标签 php mysql

我有一个像这样的 csv 文件

col1, col2, col3
1 ,  John, ABC

我需要将第 3 列中的 ABC 解析为 A,B,C 因为新关系需要 col1, col3(每个字母) .

$j 是行,$i 是列。

$j = 0;  
while (($row = fgetcsv($handle, 1000, ',')) !== false) {
    $i = 0;
    $id = 0;
    foreach ($row as $field) {
        # save the id of each row
        if($j >0 && $i == 0){
            $id = $field;
        }

        # parse the third column for non-header rows)
        if($j > 0 && $i >= 3){
            $char_array = str_split($field);
            foreach($char_array as $value){
                //echo $value;
                //echo $id.$value."<br/>";
                mysql_query("INSERT INTO sample VALUES('".$id."', '".$value."')");
            }
        }
        $i = $i + 1;  # increment the column
    }
    $j = $j +1;   # move to the next row
}
  1. 这很慢。我有720多行,其中大部分在第三列有超过5个字符。 ABCDE,所以我们平均有 720 x 5。这是一个很大的数字。 我收到超时。我可以更改本地执行的最长时间,但我需要在我的学生 Linux 帐户上运行它。我没有那种特权。

  2. 我怀疑是因为超时(这次没说),我上了id = 502。我遗漏了其余部分(我最多有 720 行)。

我能做什么?我只对第一列和第三列感兴趣。

最佳答案

IO磁盘读写也很慢。但它不会超时并且使用缓存你实际上不会执行那么糟糕。事实上,我一直这样做,在 PHP 中使用大于 20MB 的数据。还不错....如果我真的想做大数据,我会使用 Python、C++ 算法,因为反正我已经准备好了。

示例,基于您的代码(可能包含错误):

$big = array(); 
$j = 0;
$k = 0;

while(....) {

    ....
    foreach($char_array as $value){
        #mysql_query("INSERT INTO sample VALUES('".$id."', '".$value."')");
        $big[$k][0] = $id;
        $big[$k][1] = $value;
        $k = $k+1;
    }

  ....
}

这里你创建了一个嵌套数组。 $big 是外部数组,在内部分配列和行。

使用fputcsv 写入一个新的csv。根据您的规范,新的 csv 应如下所示:

1, A

1, B

这是写入 csv 的代码(来自 php 文档)

$fp = fopen('new.csv', 'w');

foreach ($big as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

}

现在您可以将 csv 加载到 db 中。


编辑。 我刚刚尝试使用 720 行这样的数据并复制和粘贴 720 次。

1, ABCDEFGHIJK

没花那么长时间……大概 1-2 秒。

关于php - 解析 CSV 并导入到 PHP 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10676490/

相关文章:

mysql - 仅从两个实体中获取匹配的记录

php 脚本 require() 语句从浏览器运行时获取文件,但从 Plesk CRON 作业运行时不获取文件

php - PhpMyAdmin 中的请求与 Laravel 查询生成器一起工作,似乎不起作用

php - 通过 Eclipse、Netbeans 或任何其他 IDE 处理远程 PHP 项目(Ubuntu 服务器)

php - 是否有工具可以帮助我弄清楚为什么我的电子邮件被标记为垃圾邮件?

mysql - 反加入组/条件

php - 是否需要安装特定的邮件程序才能使用 PHP mail() 发送电子邮件?

MySQL获取第一条记录和第n条记录的时间差

mysql - WordPress Live 站点中的链接图像正在重定向到本地主机

php - 如果已选中,如何将复选框值插入数据库表?