Я ищу импорт файла CSV, но этот файл довольно большой.Импорт больших CSV-файлов
Что я ищу сделать, это 2 вещи:
1) Scan the CSV to validate values in particular fields
2) Once the file is valid, import
Данные CSV могут ONLY
быть вставлены, если файл является действительным (все или ничего)
Проблема в том, я m цикл через дважды, 1-й для проверки полей CSV действительны, а затем еще один цикл for
для сохранения.
Проблема в памяти. У меня заканчивается память (файл - 100 000 строк с 45 полями)
Есть ли более простой способ сделать это и уменьшить память? Я использую AR-реализацию, будет ли использование PDO быстрее?
Благодаря
EDIT:
$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);
}
}
Вы можете использовать 'fopen' и' fgets' и обрабатывать его вручную по одной строке за раз. Что значит «действительно»? – h2ooooooo
Мы, вероятно, должны увидеть ваш код, чтобы помочь вам уменьшить использование памяти. Кроме того, вы должны вставлять только одну транзакцию, а не строку за строкой. – mcryan
@ h2ooooooo У меня есть валидация с точки зрения полей (должно быть число, начинающееся с 99 и должно быть 15 символов и т. Д. И т. Д.). Я использую 'fopen' и' fgetcsv' для открытия и анализа –