Работа с 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, '