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

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

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

Начать курс

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

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

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

PHP имеет две ключевые функции: fgetcsv() для чтения и fputcsv() для записи. Они автоматически обрабатывают разделители, кавычки и экранирование.

Чтение CSV файла построчно

Базовый пример чтения CSV с помощью fgetcsv():

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

if (($handle = fopen($filename, 'r')) !== false) {
    // Читаем заголовки (первая строка)
    $headers = fgetcsv($handle, 1000, ',');
    
    if ($headers !== false) {
        echo "Заголовки: " . implode(', ', $headers) . "<br>";
        
        // Читаем данные построчно
        while (($row = fgetcsv($handle, 1000, ',')) !== false) {
            echo "Строка: " . implode(' | ', $row) . "<br>";
        }
    }
    
    fclose($handle);
}
?>

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

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

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

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

<?php
$data = [
    ['ID', 'Имя', 'Email', 'Дата регистрации'],
    [1, 'Иван Петров', 'ivan@example.com', '2024-01-15'],
    [2, 'Мария Сидорова', 'maria@example.com', '2024-02-20'],
    [3, 'Алексей "Профессор" Иванов', 'alex@example.com', '2024-03-10']
];

$filename = 'users.csv';

if (($handle = fopen($filename, 'w')) !== false) {
    // Записываем BOM для корректного отображения кириллицы в Excel
    fwrite($handle, "\xEF\xBB\xBF");
    
    foreach ($data as $row) {
        fputcsv($handle, $row, ';'); // Используем точку с запятой для Excel
    }
    
    fclose($handle);
    echo "Файл $filename успешно создан!";
}
?>

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

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

<?php
function processLargeCSV($filename, callable $callback) {
    $handle = fopen($filename, 'r');
    if ($handle === false) {
        throw new Exception("Не удалось открыть файл: $filename");
    }
    
    $headers = fgetcsv($handle, 0, ',');
    if ($headers === false) {
        fclose($handle);
        throw new Exception("Пустой файл или ошибка чтения заголовков");
    }
    
    $rowNumber = 1;
    while (($row = fgetcsv($handle, 0, ',')) !== false) {
        if (count($row) !== count($headers)) {
            // Пропускаем строки с неверным количеством полей
            continue;
        }
        
        // Комбинируем заголовки с данными
        $assocRow = array_combine($headers, $row);
        call_user_func($callback, $assocRow, $rowNumber);
        $rowNumber++;
    }
    
    fclose($handle);
}

// Использование:
processLargeCSV('bigdata.csv', function($row, $number) {
    echo "Строка #$number: {$row['email']} - {$row['name']}<br>";
});
?>

Работа с разными разделителями и кодировками

Часто CSV файлы используют разные разделители (запятая, точка с запятой, табуляция) и кодировки. Вот как с этим работать:

<?php
function readFlexibleCSV($filename, $delimiter = null, $encoding = 'UTF-8') {
    $handle = fopen($filename, '                    

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