Блог о программировании на PHP, Yii2, 1C-Bitrix

Чтение CSV файла в PHP

При чтении csv, содержащего кириллицу, обычная функция fgetcsv опускает ее содержимое, одно из решений, использовать функцию fgetcsv2:

function fgetcsv2($f_handle, $length, $delimiter=';', $enclosure='"') {
if (!strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')
return fgetcsv($f_handle, $length, $delimiter, $enclosure);

//если указатель на файл не задан, то возвращаем false
if (!$f_handle || feof($f_handle))
return false;

//если разделитель не задан, то возвращаем false
if (strlen($delimiter) > 1)
$delimiter = substr($delimiter, 0, 1);
elseif (!strlen($delimiter))
return false;

if (strlen($enclosure) > 1) // There _MAY_ be an enclosure
$enclosure = substr($enclosure, 0, 1);

$line = fgets($f_handle, $length);
if (!$line)
return false;
$result = array();
$csv_fields = explode($delimiter, trim($line));
$csv_field_count = count($csv_fields);
$encl_len = strlen($enclosure);
for ($i = 0; $i < $csv_field_count; $i++) {
if ($encl_len && $csv_fields[$i]{0} == $enclosure)
$csv_fields[$i] = substr($csv_fields[$i], 1);
if ($encl_len && $csv_fields[$i]{strlen($csv_fields[$i]) - 1} == $enclosure)
$csv_fields[$i] = substr($csv_fields[$i], 0, strlen($csv_fields[$i]) - 1);
$csv_fields[$i] = str_replace($enclosure . $enclosure, $enclosure, $csv_fields[$i]);
$result[] = $csv_fields[$i];
}
return $result;
}