PHP和大型CSV文件

时间:2013-07-10 13:22:21

标签: php csv notorm

我使用名为parsecsv.lib.php的库来读取csv文件。但是文件的大小已增加到大约30MB。该库试图将csv的全部内容加载到一个数组中,该数组将转换为包含100,000多个元素的数组。这显然不好,所以我推出了自己的解决方案,如下所示:

private static function _get2DArrayFromCsvAndSave($file, $delimiter, $enclosure, $table)
{
    ini_set('auto_detect_line_endings', TRUE);
    if (($fp = fopen($file, "r")) !== FALSE)
    {
        $headers = fgetcsv($fp, 0, $delimiter, $enclosure);
        while (($row = fgetcsv($fp, 0, $delimiter, $enclosure)) !== FALSE)
        {
            $data = array();
            foreach ($headers as $i => $col)
            {
                $data[$col] = $row[$i];
            }
            self::_save($table, $data);
            echo "*";
        }
    }
    fclose($fp);
}

这是一次读取一行并使用键作为标题保存然后保存。

我的问题是,如果我将数据量增加到我的保存方法中,我会获得任何速度提升。现在它一次只有一个数组,但我可以为它提供一个数组并保存它们。 我只是不确定是否有任何优势来分块数据。任何有经验的人都有任何见解

以下是保存方法:

private static function _save($table, $data)
{
    $save = array();
    $i = 0;
    foreach ($data as $key => $value)
    {
        $key = '`'.strtolower(str_replace(' ', '', $key)).'`';
        // this sets the primary key for NotORM's insert_update method
        if ($i == 0)
            $id = $key;
        $i++;            
        $save[$key] = trim($value);            
    }
    self::$db->$table->insert_update(
            array($id => $save[$id]),
            $save,
            array());
}

0 个答案:

没有答案