【问题标题】:Read data from csv or comma separated files [duplicate]从 csv 或逗号分隔的文件中读取数据 [重复]
【发布时间】:2012-11-05 10:48:53
【问题描述】:

可能重复:
Import CSV file directly into MySQL

我尝试使用不同的方法(其中一种方法如下)从 php 中的 csv 文件或大文件大小(超过 250MB)的逗号分隔文件中读取数据,因此我可以将所需数据从中插入 mysql 数据库但是程序每次在文件读取完成之前都会崩溃。我还尝试增加 php.ini 中的内存限制。 面临以下错误:-

1.------------------------------------------ ----

memory_limit = 128M 致命错误:第 19 行 C:\wamp\www\site\files\plugin\agoda\agoda.plugin.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 63 字节)

2.------------------------------------------ ----

memory_limit = 1000M 致命错误:第 19 行 C:\wamp\www\site\files\plugin\agoda\agoda.plugin.php 中允许的内存大小为 1048576000 字节已用尽(尝试分配 1299 字节)

3.------------------------------------------ ----

memory_limit = 2000M

我需要一种在 php 中读取此类文件而不会使程序崩溃的方法。

【问题讨论】:

  • 不要试图一口气读入整个csv文件,然后再处理;一次读取一行,处理,然后读取下一行(重复直到 eof)
  • 如果您不使用 PHP 对 CSV 文件进行任何计算,请考虑直接使用 MySql 将其导入。除此之外,这里没有问题,因为你只陈述了之前已经被问到和回答过的明显的记忆错误。
  • @Mark Ba​​ker,你能指导我如何逐行读取 csv 并在应用一些过滤器/函数/整流器后将其添加到 mysql
  • @Gordon,你能指导我如何逐行读取 csv 并在应用一些过滤器/函数/整流器后将其添加到 mysql
  • @adnanmasood 是的,我可以。但请先做研究。

标签: php csv filereader memory-limit


【解决方案1】:

我提供此代码修改它以满足您的需求

$source = fopen('zipcode.csv', 'r') or die("Problem open file");
    while (($data = fgetcsv($source, 1000, ",")) !== FALSE)
    {
        $zip = $data[0];
        $city = $data[1];
        $state = $data[2];
        $latitude = $data[3];
        $longitude = $data[4];
        $timezone = $data[5];
        $dst = $data[6];

        mysql_query("INSERT INTO `latlong` (`zip`,`city`,`state`,`latitude`,`longitude`,`timezone`,`dst`) VALUES (".$zip.",'".$city."','".$state."','".$latitude."','".$longitude."',".$timezone.",".$dst.")");

    }
    fclose($source);

【讨论】:

  • 你不必在 while 结束时取消设置 $data (仍在循环内)吗?至少在使用 php 4 时,我在那里遇到了非常糟糕的经历,有时 $data 没有按预期覆盖,而是旧的 $data 被留下作为内存尸体(内存泄漏)并创建了一个新的 $data。
  • 不,你不应该担心内存泄漏...... PHP 在过去 15 年里进步了一点
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多