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

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

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

Начать курс

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

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

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

PHP предоставляет несколько встроенных функций, которые позволяют работать с CSV-файлами без установки дополнительных библиотек. Основные из них:

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

Чтение CSV-файла с помощью fgetcsv

Функция fgetcsv() читает одну строку из открытого файла и возвращает её в виде массива. Пример чтения всего файла:

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

if (($handle = fopen($filename, 'r')) !== false) {
    while (($data = fgetcsv($handle, 1000, ',')) !== false) {
        // $data — массив с данными строки
        echo implode(' | ', $data) . "\n";
    }
    fclose($handle);
}
?>

Параметры функции fgetcsv():

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

Запись данных в CSV-файл

Для записи используется функция fputcsv(). Она принимает массив и преобразует его в строку CSV:

<?php
$data = [
    ['Имя', 'Возраст', 'Город'],
    ['Иван', 25, 'Москва'],
    ['Мария', 30, 'Санкт-Петербург'],
];

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

foreach ($data as $row) {
    fputcsv($handle, $row, ';', '"');
}

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

В этом примере мы используем точку с запятой (;) в качестве разделителя, что часто встречается в русскоязычных CSV-файлах.

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

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

<?php
function processLargeCSV($filename) {
    $handle = fopen($filename, 'r');
    
    // Пропускаем заголовок, если он есть
    $header = fgetcsv($handle);
    
    while (($row = fgetcsv($handle)) !== false) {
        // Обрабатываем каждую строку
        $processed = array_map('trim', $row);
        // Здесь может быть ваша логика обработки
        yield $processed; // Используем генератор
    }
    
    fclose($handle);
}

// Использование
foreach (processLargeCSV('bigdata.csv') as $row) {
    // Работаем с каждой строкой отдельно
    echo "Обработана строка: " . implode(',', $row) . "\n";
}
?>

Использование генераторов (yield) позволяет обрабатывать файлы любого размера без переполнения памяти.

Библиотека League\Csv для продвинутой работы

Для более сложных задач рекомендуется использовать библиотеку league/csv. Она предоставляет удобный объектно-ориентированный интерфейс и множество дополнительных возможностей.

Установка через Composer:

composer require league/csv

Пример использования:

<?php
require 'vendor/autoload.php';

use League\Csv\Reader;
use League\Csv\Writer;

// Чтение CSV
$csv = Reader::createFromPath('data.csv', 'r');
$csv->setHeaderOffset(0); // Первая строка — заголовок

// Получение всех записей как ассоциативных массивов
$records = $csv->getRecords();
foreach ($records as $record) {
    echo $record['Имя'] . ' — ' . $record['Город'] . "\n";
}

// Запись CSV
$writer = Writer::createFromPath('new.csv', 'w');
$writer->insertOne(['Наз                    

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