fgetcsv
Данная функция похожа на функцию fgets() , с той разницей, что она производит анализ строки на наличие записей в формате CSV и возвращает найденные поля в качестве массива.
Список параметров
Корректный файловый указатель на файл, успешно открытый при помощи fopen() , popen() или fsockopen() .
Должен быть больше самой длинной строки (в символах), найденной в CSV-файле (включая завершающий символ конца строки). Данный параметр стал необязательным в PHP 5. Если этот аргумент не указан (или равен 0 в версиях PHP 5.1.0 и выше), максимальная длина строки не ограничена, но функция работает немного медленнее.
Необязательный параметр delimiter устанавливает разделитель поля (только один символ).
Необязательный параметр enclosure устанавливает символ ограничителя поля (только один символ).
Необязательный параметр escape устанавливает экранирующий символ (только один символ).
Возвращаемые значения
Возвращает индексированный массив с прочтенными полями.
Замечание:
Пустая строка CSV-файла будет возвращена в качестве массива, содержащего единственный элемент null , ошибки в данном случае не возникнет.
Замечание: Если у вас возникают проблемы с распознаванием PHP концов строк при чтении или создании файлов на Macintosh-совместимом компьютере, включение опции auto_detect_line_endings может помочь решить проблему.
fgetcsv() возвращает NULL , если передаётся неверный параметр handle или FALSE при других ошибках, в том числе и по достижению конца файла.
Список изменений
Версия | Описание |
---|---|
5.3.0 | Добавлен параметр escape |
5.1.0 | Параметр length стал необязательным. По умолчанию равен 0, что означает отсутствие ограничения длины. |
4.3.5 | fgetcsv() теперь безопасна для обработки бинарных данных |
Примеры
Пример #1 Чтение и вывод на экран содержимого CSV-файла
$row = 1 ;
if (( $handle = fopen ( «test.csv» , «r» )) !== FALSE ) while (( $data = fgetcsv ( $handle , 1000 , «,» )) !== FALSE ) $num = count ( $data );
echo »
$num полей в строке $row :
\n» ;
$row ++;
for ( $c = 0 ; $c < $num ; $c ++) echo $data [ $c ] . "
\n» ;
>
>
fclose ( $handle );
>
?>?php
Примечания
Замечание:
Эта функция принимает во внимание настройки локали. К примеру, если LANG установлена в en_US.UTF-8, то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.
Смотрите также
- str_getcsv() — Выполняет разбор CSV-строки в массив
- explode() — Разбивает строку с помощью разделителя
- file() — Читает содержимое файла и помещает его в массив
- pack() — Упаковывает данные в бинарную строку
- fputcsv() — Форматирует строку в виде CSV и записывает её в файловый указатель
Чтение CSV-файла в PHP
В этой статье я покажу простой пример того, как прочитать данные их CSV-файла, и записать их в массив для дальнейшей работы с данными. Мы напишем простой код по парсингу CSV на PHP, которую можно будет использовать конвертации CSV-данных в массив, или JSON.
Прежде всего, разберёмся, что за формата такой этот CSV. Это формат хранения данных в текстовом документе, где каждая запись записывается с новой строки, в которой все значения разделены запятой (отсюда и имеем название формата — Comma Separated Values).
Итогово, CSV-формат состоит из переносов на новую строку и запятых, и это всё, что вам нужно знать.
Формата записи CSV можно увидеть на примере:
ID,Login,Age
1,User1,18 // одна запись
2,User2,19 // новая запись
3,User3,20 // и ещё одна
На примере, первая колонка — это ID пользователя, вторая — логин, и последняя — возраст пользователя. Как можете видеть, каждый пользователь отделён переносом на новую строку.
Зная своего врага в лицоПонимая, что это обычная строка, мы уже можем распарсить CSV, используя PHP функции для работы со строкой. Забегая наперёд, скажу, что в PHP есть встроенные средства по парсингу CSV (её мы рассмотрим дальше, сравнивая 2 разных подхода).
Потому, для полного понимания, как происходит чтение CSV файла построчно, напишем код, без использования встроенных решений парсинга CSV на PHP:
$file = __DIR__ . '/example.csv'; // читаем содержимое файла, формируем массив данных, к каждому элементу массива применяем функцию trim (для удаления лишних пробелов) $rows = array_map('trim', file($file)); // удаляем первую строку названия полей ID,Login,Age array_shift($rows); foreach ($rows as $index => $row) < // теперь строку вида 1,User1,18 разделяем по запятой, удаляя лишние пробелы $params = array_map('trim', explode(',', $row)); $id = $params[0]; $login = $params[1]; $age = $params[2]; // или же, короче list($id, $login, $age) = $params; >
И теперь, на просмотерв этот код, вы знаете, как читать CSV файлы на PHP, используя обычные функции работы со строкой.
Парсинг CSV на примере встроенной функции fgetcsv
В PHP есть встроенная функция fgetcsv, которая облегчает работу по парсингу CSV-файлов. Эта функция избавляет нас от лишней работы, от «низкоуровневого» парсинга строки. Эта функция автоматически распарсит CSV поля и строки, сохраняя данные в массив.
Перепишем код, написанный ранее, используя функцию fgetcsv:
$file = __DIR__ . '/example.csv'; //открываем файл с CSV-данными $fh = fopen($file, "r"); // делаем пропуск первой строки, смещая указатель на одну строку fgetcsv($fh, 0, ','); //читаем построчно содержимое CSV-файла while (($row = fgetcsv($fh, 0, ',')) !== false) < $id = $row[0]; $login = $row[1]; $age = $row[2]; // или же, короче list($id, $login, $age) = $row; >
Когда вы запустите этот код, вы сможете увидеть, что в переменной $row находится массив, содержащий данные каждой из колонок. И любое значение можно будет получить, работая как с обычным массивом, получая элемент по его соответствующему индексу.
Рассматривая на примере моих исходных данных, каждая строка CSV-данных имеет 3 колонки, данные из которых можно прочитать, вызвав: $row[0] , $row[1] , $row[2] .
Так же, можете заметить, что функция fgetcsv облегчила нам работу, выполняя всю чёрную работу по парсингу самостоятельно (в отличии от варианта, который рассматривался вначале).
Преобразование CSV в массив
Теперь, понимая, как парсить CSV, покажу код преобразования CSV в ассоциативный массив. Используем предыдущий код, немного его дополним:
$fh = fopen(__DIR__ . '/example.csv', "r"); fgetcsv($fh, 0, ','); // массив, в который данные будут сохраняться $data = []; while (($row = fgetcsv($fh, 0, ',')) !== false) < list($id, $login, $age) = $row; $data[] = [ 'id' =>$id, 'login' => $login, 'age' => $age ]; > // теперь в массиве $data расположены все элементы из CSV-файла foreach ($data as $row) < echo 'ID:' . $row['id']; echo 'Age:' . $row['age']; echo 'Login:' . $row['login']; //. >// или же, чтобы преобразовать в JSON, достаточно написать header('Content-Type: application/json'); die(json_encode($data));
На этом примере, я показал, как конвертировать csv в массив, а так же, как конвертировать CSV в JSON.
Резюме
В этой статье я подробно рассказал, как можно работать с CSV в PHP, какими способами парсить, и как отображать данные, полученные из CSV. Писал максимально подробно и вариативно, надеюсь, вопросов не осталось ^^.
В серці. Назавжди.
Вчора у мене помер однокласник. А сьогодні бабуся. І хто б міг уявити, що цей рік принесе війну, смерть товариша, та смерть члена сім’ї? Це боляче. Проте це добре нагадування про те, як швидко тече час. І як його ціна збільшується кожної марно витраченої секунди. І я не скажу щось
Ось такий він, руський мир
«Руський мир» — звучить дуже сильно та виправдовуюче. Гарна обгортка виправдання слабкості, аморальності та нікчемності своїх дійсних намірів. Руський мир, який дуже солодко звучить для всіх, хто хоче закрити очі на факт повномасштабної війни. Дуже добре виправдання вбивства для купки звірів. Втім, це ж росія, в якій все виглядає логічно
Перехват запросов и ответов JavaScript Fetch API
Перехватчики — это блоки кода, которые вы можете использовать для предварительной или последующей обработки HTTP-вызовов, помогая в обработке глобальных ошибок, аутентификации, логирования, изменения тела запроса и многом другом. В этой статье вы узнаете, как перехватывать вызовы JavaScript Fetch API. Есть два типа событий, для которых вы можете захотеть перехватить HTTP-вызовы: