Fgetcsv: примеры (PHP)

Использование fgetcsv для работы с CSV форматом в PHP
Раздел: Работа с файлами
fgetcsv(resource $stream, ?int $length = null, string $separator = ",", string $enclosure = '"', string $escape = "\\"): array|false

Функция fgetcsv в PHP

Функция fgetcsv() используется в PHP для построчного чтения CSV-файлов. Она автоматически разбирает строки, разделяя их на поля согласно заданным параметрам.

Когда применяется функция

Функция удобна при импорте данных из табличных форматов, обработке экспортированных из электронных таблиц файлов, обмене информацией между системами.

Аргументы функции
  • $stream (обязательный) — указатель на файл, открытый функцией fopen().
  • $length (необязательный) — максимальная длина считываемой строки. Значение 0 отключает ограничение.
  • $separator (необязательный) — символ-разделитель полей. По умолчанию запятая.
  • $enclosure (необязательный) — символ обрамления полей. По умолчанию двойная кавычка.
  • $escape (необязательный) — экранирующий символ. По умолчанию обратный слеш (\\)

Примеры применения fgetcsv

Базовое использование

Чтение стандартного CSV-файла:

$handle = fopen('data.csv', 'r');
if ($handle) {
    while (($row = fgetcsv($handle)) !== false) {
        print_r($row);
    }
    fclose($handle);
}
Array
(
    [0] => Иван
    [1] => Петров
    [2] => 25
)
Array
(
    [0] => Анна
    [1] => Сидорова
    [2] => 30
)
С указанием разделителя

Работа с файлом, где поля разделены точкой с запятой:

$row = fgetcsv($handle, 0, ';');
С ограничением длины строки
$row = fgetcsv($handle, 100);

Похожие функции в PHP

str_getcsv()

Разбирает CSV-строку в массив. Удобна при обработке данных из строковых переменных.

SplFileObject

Объектно-ориентированный подход к работе с файлами. Класс предоставляет метод fgetcsv().

League\Csv

Библиотека для расширенной работы с CSV. Предлагает больше возможностей для сложных операций.

Аналоги в других языках

Fgetcsv в Python

Модуль csv предоставляет reader и DictReader:

import csv
with open('data.csv') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Fgetcsv в Javascript

Библиотеки PapaParse или manual parsing:

const csv = `name,age\nИван,25`;
const rows = csv.split('\n').map(r => r.split(','));

Fgetcsv в MySQL

Команда LOAD DATA INFILE:

LOAD DATA INFILE 'data.csv' INTO TABLE users FIELDS TERMINATED BY ',';

Распространенные ошибки

Неверная кодировка

Проблемы с отображением кириллицы при чтении файлов в Windows-1251:

// Без конвертации
$row = fgetcsv($handle);
// С конвертацией
$row = array_map(function($item) {
    return mb_convert_encoding($item, 'UTF-8', 'Windows-1251');
}, fgetcsv($handle));
Игнорирование заголовков

Попытка обработать первую строку как данные:

fgetcsv($handle); // Пропускаем строку заголовков
while (($row = fgetcsv($handle)) !== false) { ... }

Изменения в новых версиях PHP

В PHP 8.1 параметр $escape по умолчанию изменен на символ обратной косой черты (\\). Ранее можно было использовать пустую строку для отключения экранирования.

В PHP 7.4 добавлена возможность передачи null в качестве разделителя для автоматического обнаружения.

Расширенные примеры

Чтение с обработкой исключений
Пример php
try {
    $handle = fopen('large.csv', 'r');
    if (!$handle) throw new Exception('Файл не открывается');
    
    $headers = fgetcsv($handle);
    $data = [];
    
    while (($row = fgetcsv($handle, 0, ',', '"', '\\')) !== false) {
        if (count($headers) === count($row)) {
            $data[] = array_combine($headers, $row);
        }
    }
    
    fclose($handle);
    print_r($data);
} catch (Exception $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
Парсинг строк с переносами внутри полей
Пример php
$content = "\"Многострочное\nполе\","другое поле"\n";
$temp = tmpfile();
fwrite($temp, $content);
fseek($temp, 0);
$row = fgetcsv($temp);
print_r($row);
Array
(
    [0] => Многострочное
поле
    [1] => другое поле
)

PHP fgetcsv function comments

En
Fgetcsv Gets line from file pointer and parse for CSV fields