Обработка большого CSV-файла с ограничением до строки

Так что после столкновения с ограничениями памяти я скопировал следующий код.

Это работало отлично. Моя единственная проблема сейчас связана с обработкой CSV-файла, структурные ограничения основаны на размере чанка, но это будет означать, что он может разрезать строку на середине пути.

Что я могу сделать, чтобы убедиться, что при создании чанка он заканчивается на / n.

0

Решение

Мне интересно знать, что делают другие.

Я изменил ограничение на определенное количество строк для чтения вместо ограничения по размеру. Вместо того, чтобы использовать fread, я использовал fgets, чтобы получить всю строку.
Еще раз, все это происходит из кода, связанного в вопросе.

<?php
function file_get_contents_chunked($file,$chunk_size,$callback)
{
try
{
$handle = fopen($file, "r");
$i = 0;
$x = 0;

$chunk = array();
while (!feof($handle)) {
while ($row = fgets($handle)) {
// can parse further $row by usingstr_getcsv
$x ++;
$chunk[] = $row;
if ($x == $chunk_size) {
call_user_func_array($callback, array($chunk, &$handle, $i));
unset($chunk);
$x = 0;
}
}
}
fclose($handle);
}
catch(Exception $e)
{
trigger_error("file_get_contents_chunked::" . $e->getMessage(),E_USER_NOTICE);
return false;
}
return true;
}

?>

// Исправлено для того, что я на самом деле намеревался ограничить количество строк

0

Другие решения

Сначала вы можете попробовать установить ограничение памяти с помощью:

ini_set('memory_limit', '32MB');

Затем, чтобы прочитать строку сразу:

$handle = fopen("inputfile.csv", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
} else {
// error opening the file.
}
fclose($handle);

На основании вашего примера кода это даст:

function file_get_contents_chunked($file,$chunk_size,$callback)
{
$handle = fopen($file, "r");
$i = 0;
if ($handle) {
while (($line = fgets($handle)) !== false) {
call_user_func_array($callback,array($line,&$handle,$i));
$i++;
}
} else {
return false;
}
fclose($handle);
return true;
}

Обратите внимание, что параметр $ chunk_size больше не нужен … поэтому вы можете удалить его, если хотите.

Вы также можете использовать эту функцию для чтения сохраненного файла построчно:

fgetcsv(file,length,separator,enclosure);

Пример 1

<?php
$file = fopen("contacts.csv","r");
print_r(fgetcsv($file));
fclose($file);
?>

Файл CSV:

Kai Jim, Refsnes, Stavanger, Norway
Hege, Refsnes, Stavanger, Norway

Вывод кода выше будет:

Array
(
[0] => Kai Jim
[1] => Refsnes
[2] => Stavanger
[3] => Norway
)
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector