Работа с CSV в PHP: чтение, запись и обработка данных

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с CSV в PHP: полное руководство

CSV (Comma-Separated Values) — один из самых популярных форматов для обмена табличными данными. В PHP работа с CSV реализована нативно, без установки дополнительных библиотек. В этой статье мы разберём все аспекты: от базового чтения до продвинутой обработки больших файлов.

Основные функции для работы с CSV

PHP предоставляет две ключевые функции для работы с CSV:

  • fgetcsv() — чтение строки CSV из файла
  • fputcsv() — запись строки в CSV-формате

Дополнительно используются стандартные функции работы с файлами: fopen(), fclose(), file().

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

Самый простой способ прочитать CSV — использовать цикл while с fgetcsv():

<?php
$filename = 'data.csv';

if (($handle = fopen($filename, 'r')) !== false) {
    // Читаем заголовки (первая строка)
    $headers = fgetcsv($handle, 1000, ',');
    
    // Читаем остальные строки
    while (($row = fgetcsv($handle, 1000, ',')) !== false) {
        echo "Имя: " . $row[0] . ", Email: " . $row[1] . "<br>";
    }
    
    fclose($handle);
}
?>

Параметры fgetcsv():

  • handle — дескриптор файла
  • length — максимальная длина строки (по умолчанию 0 — без ограничений)
  • separator — разделитель полей (по умолчанию запятая)
  • enclosure — символ кавычек (по умолчанию двойные кавычки)
  • escape — escape-символ (по умолчанию обратная косая черта)

Чтение CSV с кастомными разделителями

Не все CSV используют запятую. Часто встречается точка с запятой (;) или табуляция:

<?php
$handle = fopen('data.tsv', 'r');
while (($row = fgetcsv($handle, 1000, "\t")) !== false) {
    print_r($row);
}
fclose($handle);
?>

Запись данных в CSV

Функция fputcsv() автоматически обрабатывает экранирование и кавычки:

<?php
$data = [
    ['Иван', 'ivan@example.com', 25],
    ['Мария', 'maria@example.com', 30],
    ['Петр', 'petr@example.com', 28]
];

$handle = fopen('users.csv', 'w');

// Записываем заголовки
fputcsv($handle, ['Имя', 'Email', 'Возраст']);

// Записываем данные
foreach ($data as $row) {
    fputcsv($handle, $row);
}

fclose($handle);
echo "CSV-файл успешно создан!";
?>

Параметры fputcsv():

  • handle — дескриптор файла
  • fields — массив полей для записи
  • separator — разделитель полей
  • enclosure — символ кавычек
  • escape — escape-символ

Экспорт данных в CSV для скачивания

Часто требуется сгенерировать CSV и отдать его пользователю для скачивания:

<?php
$data = [
    ['Товар', 'Цена', 'Количество'],
    ['Ноутбук', 75000, 10],
    ['Мышь', 1500, 50],
    ['Клавиатура', 3500, 30]
];

header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="products.csv"');

$output = fopen('php://output', 'w');
// Добавляем BOM для корректного отображения кириллицы в Excel
fprintf($output, chr(0xEF).chr(0xBB).chr(0xBF));

foreach ($data as $row) {
    fputcsv($output, $row);
}

fclose($output);
exit;
?>

Обработка больших CSV-файлов

При работе с большими файлами (сотни тысяч строк) важно избегать загрузки всего файла в память. Используйте потоковую обработку:

<?php
function processLargeCSV($filename, $batchSize = 1000) {
    $handle = fopen($filename,                    

Рекомендаций