SplFileObject::fgetcsv
(PHP 5 >= 5.1.0, PHP 7)
SplFileObject::fgetcsv — Получение строки файла и ее разбор в соответствии с CSV разметкой
Описание
$delimiter
= ","
[, string $enclosure
= "\""
[, string $escape
= "\\"
]]] )Извлекает строку из файла и разбирает ее в соответствии с форматом CSV. Результаты разбора возвращает в виде массива.
Список параметров
-
delimiter
-
Разделитель полей (один символ). По умолчанию это запятая или символ, который был задан методом SplFileObject::setCsvControl().
-
enclosure
-
Символ обрамления полей (один символ). По умолчанию это двойная кавычка или символ, который был задан методом SplFileObject::setCsvControl().
-
escape
-
Экранирующий символ (один символ). По умолчанию это обратный слеш (\) или символ, который был задан методом SplFileObject::setCsvControl().
Возвращаемые значения
Возвращает массив содержащий данные прочитанной строки или FALSE
в случае
ошибки.
Замечание:
Пустая строка CSV файла будет возвращаться в виде массива, содержащего единственный элемент
NULL
, если не включена опцияSplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE
, которая позволяет пропускать пустые строки.
Примеры
Пример #1 Пример использования SplFileObject::fgetcsv()
<?php
$file = new SplFileObject("data.csv");
while (!$file->eof()) {
var_dump($file->fgetcsv());
}
?>
Пример #2 Пример использования SplFileObject::READ_CSV
<?php
$file = new SplFileObject("animals.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $row) {
list($animal, $class, $legs) = $row;
printf("A %s is a %s with %d legs\n", $animal, $class, $legs);
}
?>
Contents of animals.csv
crocodile,reptile,4 dolphin,mammal,0 duck,bird,2 koala,mammal,4 salmon,fish,0
Результатом выполнения данного примера будет что-то подобное:
A crocodile is a reptile with 4 legs A dolphin is a mammal with 0 legs A duck is a bird with 2 legs A koala is a mammal with 4 legs A salmon is a fish with 0 legs
Смотрите также
- SplFileObject::setCsvControl() - Устанавливает символы разделителя и ограничителя для CSV
- SplFileObject::setFlags() - Устанавливает флаги для SplFileObject
- SplFileObject::READ_CSV
- SplFileObject::current() - Получение текущей строки файла
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Стандартная библиотека PHP (SPL)
- Обработка файлов
- Функция SplFileObject::__construct() - Конструктор класса SplFileObject
- Функция SplFileObject::current() - Получение текущей строки файла
- Функция SplFileObject::eof() - Проверяет, достигнут ли конец файла
- Функция SplFileObject::fflush() - Сбрасывает буфер вывода в файл
- Функция SplFileObject::fgetc() - Читает символ из файла
- Функция SplFileObject::fgetcsv() - Получение строки файла и ее разбор в соответствии с CSV разметкой
- Функция SplFileObject::fgets() - Читает строку из файла
- Функция SplFileObject::fgetss() - Получение строки из файла с очисткой от HTML тэгов
- Функция SplFileObject::flock() - Портируемая блокировка файла
- Функция SplFileObject::fpassthru() - Выводит все оставшееся содержимое файла в выходной поток
- Функция SplFileObject::fputcsv() - Выводит поля массива в виде строки CSV
- SplFileObject::fread
- Функция SplFileObject::fscanf() - Разбор строки файла в соответствии с заданным форматом
- Функция SplFileObject::fseek() - Перевод файлового указателя на заданную позицию
- Функция SplFileObject::fstat() - Получает информацию о файле
- Функция SplFileObject::ftell() - Определение текущей позиции файлового указателя
- Функция SplFileObject::ftruncate() - Обрезает файл до заданной длины
- Функция SplFileObject::fwrite() - Запись в файл
- Функция SplFileObject::getChildren() - Метод-заглушка
- Функция SplFileObject::getCsvControl() - Получает символы разделителя и ограничителя для CSV
- Функция SplFileObject::getCurrentLine() - Псевдоним метода SplFileObject::fgets
- Функция SplFileObject::getFlags() - Получает флаги настройки объекта SplFileObject
- Функция SplFileObject::getMaxLineLen() - Получает максимальную длину строки
- Функция SplFileObject::hasChildren() - Класс SplFileObject не имеет наследников
- Функция SplFileObject::key() - Получение номера строки
- Функция SplFileObject::next() - Читает следующую строку
- Функция SplFileObject::rewind() - Перевод файлового указателя в начало файла
- Функция SplFileObject::seek() - Перевод файлового указателя на заданную строку
- Функция SplFileObject::setCsvControl() - Устанавливает символы разделителя и ограничителя для CSV
- Функция SplFileObject::setFlags() - Установливает флаги для SplFileObject
- Функция SplFileObject::setMaxLineLen() - Устанавливает максимальную длину строки
- Функция SplFileObject::__toString() - Псевдоним SplFileObject::current
- Функция SplFileObject::valid() - Проверяет, достигнут ли конец файла (EOF)
Коментарии
after setting the delimiter '\t' fgetcsv() truncates the value when it is empty string
workaround:
<?php
$file = new SplFileObject($path);
$file->setFlags(SplFileObject::DROP_NEW_LINE);
while ($file->valid()) {
$line = $file->fgets();
$line = explode("\t", $line);
print_r($line);
}
?>
Note that due to bugs 55807 and 61032, introduced in 5.3.8, if the csv in example #2 has a newline character at the end of each line, the foreach will execute 6 times.
The last time through the loop $row will be bool(false). This is true even if using SplFileObject::SKIP_EMPTY and SplFileObject::DROP_NEW_LINE.
Until the bug is fixed, the workaround is to also add SplFileObject::READ_AHEAD to your setFlags() call.
If your CSV doesn't have enclosures, you can face an issue with default " identified as enclosure in data. Empty $enclosure is not allowed, but you can use same $enclosure as $delimiter (\n by default) to emulate empty enclosure.
Be aware.
There is bug 46569 persists that breaks usage of SplFileObject::fgetcsv() after SplFileObject::seek()-ing to a non-zero position and then returns the contents of wrong line - off by one
<?php
$file = new SplFileObject('foo/bar.csv');
$file->seek(1);
print_r($file->fgetcsv()); // reads 3rd line against 2nd
Also while the enclosure character cannot be NULL you can set it to ASCII NUL character chr(0) with the same practical effect.
Not that this may return NULL instead of FALSE depending on the given SplFileObject flags in versions prior to PHP 8.1.
Change: https://github.com/php/php-src/commit/188b1d4c7c7b3482584e248522d94e06ba616a1c
Testcase: https://3v4l.org/6dQTT