Чтение и запись данных в CSV-файл средствами PHP

Обычно, если стоимость создания интернет магазина достаточно высока или имеет большое количество товаров, заказчики просят сделать импорт товаров из их прайс листов. PHP как известно, не умеет работать с Excel-файлами стандартными средствами. Конечно есть множество различных классов и библиотек, которые могут читать и записывать информацию в Excel, но с ними возникает достаточно много проблем и неудобств.

Гораздо проще и удобнее работать с CSV-файлами.

Как Вы знаете, CSV — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом — обычно запятой (,).

Как это работает:

Предлагаю разобрать простой способ чтения и записи данных в CSV-файл стандартными возможностями PHP.

Пример записи данных:

<?php
$list = array (
	array('aaa', 'bbb', 'ccc', 'dddd'),
	array('123', '456', '789'),
	array('"aaa"', '"bbb"')
);
$fp = fopen('file.csv', 'w');
foreach ($list as $fields) {
	fputcsv($fp, $fields, ';', '"');
}
fclose($fp);
?>

Первым делом мы формируем двумерный массив значений $list. Функция fopen() закрепляет именованный ресурс, указанный в аргументе filename, за потоком, а также указываем режим работы с файлом. Со списком режимов работы с файлом Вы можете ознакомиться в конце статьи.

Запись в файл производится построчно, поэтому имея двумерный массив мы вызываем функцию записи fputcsv() в цикле.Функция fputcsv() форматирует строку (переданную в виде массива) в виде CSV и записывает её (заканчивая переводом строки) в указанный файл. Как видите, в этой функции мы указываем файл $fp, в который производим запись, строку $fields, которая содержит значения полей, а также такие параметры, как разделитель полей (в нашем случае это точка с запятой) и ограничитель полей (у нас это двойная кавычка).

После окончания записи, не забываем закрывать дескриптор файла fclose().

Пример чтения данных:

<?php
if (($fp = fopen("file.csv", "r")) !== FALSE) {
	while (($data = fgetcsv($fp, 0, ";")) !== FALSE) {
		$list[] = $data;
	}
	fclose($fp);
	print_r($list);
}
?>

С помощью функции fopen() мы пытаемся открыть файл для чтения и, если он есть, построчно заполняем массив данными с помощью функции fgetcsv(). Функция fgetcsv() читает строку из файла и производит разбор данных CSV. Данная функция похожа на функцию fgets(), с той разницей, что она производит анализ строки на наличие записей в формате CSV и возвращает найденные поля в качестве массива. В эту функцию мы передаем такие параметры как корректный файловый указатель на успешно открытый файл, длину строки (обычно указывается длина большая самой длинной строки в файле, в нашем случае мы указываем 0, т.е. длина не ограничена), а также разделитель поля (т.к. в примере для записи мы использовали точку с запятой, то и для чтения будем использовать её).

И опять же, после выполнения чтения из файла не забываем закрывать дескриптор файла fclose().

Список возможных режимов для fopen():
'r' - Открывает файл только для чтения; помещает указатель в начало файла.
'r+' - Окрывает файл для чтения и записи; помещяет указатель в начало файла.
'w' - Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
'w+' - Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует - пробует его создать.
'a' - Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует - пробует его создать.
'a+' - Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует - пробует его создать.
'x' - Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, пытается его создать.
'x+' - Создаёт и открывает для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, пытается его создать.

Как видите, мы разобрали лишь теорию, но если вынести чтение из файла и запись в файл отдельными функциями, правильно организовать обработку ошибок, то можно реализовать неплохой функционал по импорту/экспорту товаров в свой интернет магазин с возможностью добавления новых товаров и обновления имеющихся. Самое главное, не забывайте про кодировку импортируемых/экспортируемых данных, а также правильно выбирайте разделитель поля, т.к. бывают ситуации, когда выбранный разделитель может встретиться просто в тексте, который Вы пытаетесь сохранить в CSV-файл, в результате чего все данные в такой строке могут отображаться некорректно.


Оставьте свой комментарий

Оставить комментарий от имени гостя

0 / 2500 Ограничение символов
Ваш текст должен быть в пределах 10-2500 символов
1 Комментарии | Добавить свои
  • Гость - Юрий

    очень познавательно, только я тоже частенько перебираю csv, но более сложными манипуляциями.... теперь смогу все упростить! спасибо!

    Комментарий последний раз редактировался в около 1 года назад Администратор
    Нравится 0 Короткий URL: