День добрый! Возникла довольно простая (вероятно слишком простая) задача для хорошего программиста, но я к сожалению пока только учусь, поэтому нужна ваша помощь :o
1. Есть большой CSV файл (около 2-5мб), нужно прочитать его с минимальным расходом памяти на сервере (например, с помощью чанков)
2. Во время чтения, превращать строку во временный массив, не дожидаясь окончания чтения
3. Временный массив поместить в цикл, в котором по второму столбцу сравнивать значение с Query (см. комментарии в примере кода ниже)
4. Если значение совпадает, вернуть всю строку, содержащую это значение
Пробовал вот так, но не совсем понимаю как оно должно работать:
function csvToArray($file, $delimiter)
{
$data = array();
$file = fopen($file, 'r');
$iterator = 0;
$header = null;
while (($row = fgetcsv($file, 1000, $delimiter)) !== false)
{
$is_mul_1000 = false;
if(!$header){
$header = $row;
}
else{
$iterator++;
$data[] = array_combine($header, $row);
if($iterator != 0 && $iterator % 1000 == 0){
$is_mul_1000 = true;
$chunk = $data;
$data = array();
yield $chunk;
}
}
}
fclose($file);
if(!$is_mul_1000){
yield $data;
}
return;
}
foreach(csvToArray('/home/catalog_new.csv', "\n") as $key => $data){
$key = array_values(array_slice($data[$key], -1))[0]; // выбирает первый столбец для поиска по нему (по задумке)
$search = 'РО-65443'; // строка для поиска
$buffer = explode('-', $key); // делим на две части
foreach($buffer as $name){
// Ищем по первой и второй части
if(!empty($name) && stripos($search, $name) !== false || $search == $name){
echo $data; // выводим строку на экран, подстрока которой, полностью или частично совпадает
}
}
}
}
Сам CSV выглядит как-то так:
1,"RZ-541-REV2|RZ-541-REV1.5|RZ-541-TEST",1,1
2,"МК-65530-RU|МК-65530-KZ|МК-65530-TEST",1,2