我正在考虑导入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);
}
}
答案 0 :(得分:0)
您已经在第一个foreach
中循环浏览数据。为什么不验证该循环中的字段,如果验证通过添加到要保存的数组,并且仅在循环完成时保存(在单个事务中)。