导入大型CSV文件

时间:2014-01-20 12:18:35

标签: php csv pdo fgetcsv

我正在考虑导入CSV文件,但此文件相当大。

我想要做的是两件事:

1) Scan the CSV to validate values in particular fields
2) Once the file is valid, import

如果文件有效(全部或全部)

,则可以插入CSV数据ONLY

问题是,我循环两次,第一次检查CSV字段是否有效,然后另一个for循环保存。

问题在于记忆。我的内存不足(文件是10万行,包含45个字段)

有没有更简单的方法来减少记忆?我正在使用AR实现,使用PDO会更快吗?

由于

编辑:

       $data = array();
        // open the file and loop through
        if( ($handle = fopen('details.csv', "r")) !== FALSE) {
            $rowCounter = 0;
            while (($rowData = fgetcsv($handle, 0, ",")) !== FALSE) {
                if( 0 === $rowCounter) {
                    $headerRecord = $rowData;
                } else {
                    foreach( $rowData as $key => $value) {
                        $data[ $rowCounter - 1][$headerRecord[ $key] ] = $value;
                    }
                }
                $rowCounter++;
            }
            fclose($handle);
        }

        $errors = array();
        // loop to check through the fields for validation
        for($i=0;$i<count($data);$i++) {
            $row++;

            if(!valid_email($data[$i]['EMAIL']))) {
               $errors[] = 'Invalid Email Address';
               break;
            }

        }

        if(empty($errors)) {
          for($j=0;$j<count($assocData);$j++) {
             $row++;

             $details = new Details();

             // set the fields here
             $details->email = $data[$j]['EMAIL'];

             $details->save();
             unset($details); 
          } 
        }

1 个答案:

答案 0 :(得分:0)

您已经在第一个foreach中循环浏览数据。为什么不验证该循环中的字段,如果验证通过添加到要保存的数组,并且仅在循环完成时保存(在单个事务中)。