Каждый день мне предоставляется файл .txt, содержащий данные, разделенные точкой с запятой. Пользователи моего приложения должны ежедневно загружать этот файл в базу данных.
В настоящее время я читаю и сохраняю информацию следующим образом:
$array = array();
$csv = str_getcsv($request->file, "\n");
foreach ($csv as &$row) {
$row = str_getcsv($row, ";");
$array[] = $row;
}
array_splice($array, 0, 1);
foreach ($array as &$row) {
$query = Table::firstOrNew(['col2' => $row[1], 'col3' => $row[2]]);
$query->col1 = $row[0];
$query->col2 = $row[1];
$query->col3 = $row[2];
$query->col4 = $row[3];
$query->col5 = $row[4];
// [...]
$query->col72 = $row[71];
$query->col73 = $row[72];
$query->save();
}
С этим методом связано то, что для успешной работы требуется слишком много времени (объем данных составляет около 5000 записей в день, что занимает ~ 2 минуты для заполнения приведенного выше кода). Как вы можете видеть, количество столбцов огромно, и данные должны быть прочитаны так, как будто они имеют дело с файлом .CSV, плюс я не могу вообще отказаться от любого из них.
Не говоря уже об увеличении этой проблемы в огромной степени, если по какой-то причине пользователь (или более) должен загрузить данные за несколько дней или даже за месяц .
Мне нужно найти лучший способ чтобы справиться с этой ситуацией. Я искал решение, но лучшее, что я смог найти, было то, что я должен использовать for
l oop вместо foreach
, что на самом деле не решило проблему.