Работа с CSV в PHP: полное руководство
CSV (Comma-Separated Values) — один из самых популярных форматов для обмена табличными данными. В PHP есть как встроенные функции для работы с CSV, так и мощные сторонние библиотеки. В этой статье мы разберём все основные способы чтения, записи и обработки CSV-файлов на PHP.
Встроенные функции PHP для работы с CSV
PHP предоставляет несколько встроенных функций, которые позволяют работать с CSV-файлами без установки дополнительных библиотек. Основные из них:
fgetcsv()— чтение строки из файла и разбор её в массивfputcsv()— запись массива в файл в формате CSVstr_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(['Наз Также в библиотеке
TBB (Intel Threading Building Blocks) для C++: полное руководство с примерами
Работа с XML в TypeScript: библиотеки для парсинга и создания XML
Работа с CSV в TypeScript: библиотеки и примеры кода
Работа с датами в Rust: обзор библиотек для времени и дат