Работа с данными в формате CSV
В этой заметке мы разберем два момента, касающихся работы с данными в формате CSV. Мы рассмотрим, как генерировать CSV-файл, обладая некими исходными данными и увидим, как вывести данные формата CSV на экран.
Данная заметка не претендует на исчерпывающее руководство, однако может стать хорошим стартом, если вы впервые столкнулись с подобной задачей.
1. Генерация CSV-файла (данных, разделенных запятыми)
Первое, что мы рассмотрим - это создание CSV-файла из уже имеющихся у нас данных. Допустим, мы получили некую информацию из базы в формате обычного многомерного массива и хотим записать эти данные в CSV-файл, который потом можно будет открыть любой офисной программой для работы с таблицами.
Пример того, что мы должны получить:
Итак:
// Формируем массив с исходными данными для записи в файл
$sales = array (array('Москва','2015-09-01','2015-10-01',345.78),
array('Екатеринбург','2015-09-01','2015-10-01',235.54),
array('Владивосток','2015-09-01','2015-10-01',187.2),
array('Пермь','2015-09-01','2015-10-01',215.31),
array('Все регионы','','',983.83));
// Указываем путь до файла
$filepath = 'sales.csv';
// Открываем файл на запись и заносим результат в дескриптор
$fo = fopen ($filepath, 'w') OR die ("Невозможно открыть $filepath");
// В цикле проходимся по каждому элементу исходного массива
foreach ($sales as $sales_line)
{
if (fputcsv($fo, $sales_line) === false)
{
die ("Ошибка при записи в csv-файл");
}
}
echo "Данные были успешно записаны в файл $filepath";
// Закрываем файл после окончания записи в него
fclose($fo) OR die ("Невозможно закрыть $filepath");
Как видите, изначально мы формируем массив с данными.
Затем создаем переменную с указанием пути до CSV-файла. Пока его нет, но он автоматически будет создан в процессе работы скрипта. В нашем случае файл лежит в той же папке, что и скрипт, который его создает.
Далее мы открываем файл на запись и заносим результат этой операции в специальный дескриптор - обычную переменную, которую мы будем чуть позже использовать при наполнении и при закрытии файла.
Отмечу также, что при попытке открыть на запись несуществующий файл он будет создан автоматически PHP-функцией fopen().
После этого нам остается совсем немного: проходимся в цикле по строкам формируемого CSV-файла, указав при этом, что при каждой итерации цикла мы должны занести значение из массива $sales в переменную $sales_line.
В цикле же идет запись данных в файл с помощью функции fputcsv(), которой мы передаем в качестве параметров тот самый дескриптор $fo и переменную $sales_line, которая последовательно хранит в себе все строки нашего будущего CSV-файла.
Для обработки возникающих ошибок мы используем условие, согласно которому функция fputcsv() будет остановлена в том случае, если операция завершится неудачей.
Если же все проходит так, как нужно, то после окончания цикла на экран будет выведено сообщнеие об успешной записи информации в файл.
Финальный аккорд - закрытие файла, после того, как мы закончили с ним работать.
Как видите, ничего сложного во всем этом процессе нет. Теперь давайте посмотрим, как можно вывести данные в формате CSV на экран (печать).
2. Вывод на экран (на печать) данных в формате CSV
Точно так же как и в первом случае, у нас есть некий исходный массив, который теперь нам нужно отобразить в браузере. Как это делается? Давайте посмотрим на код ниже.
// Формируем массив с исходными данными для вывода на экран
$sales = array (array('Москва','2015-09-01','2015-10-01',345.78),
array('Екатеринбург','2015-09-01','2015-10-01',235.54),
array('Владивосток','2015-09-01','2015-10-01',187.2),
array('Пермь','2015-09-01','2015-10-01',215.31),
array('Все регионы','','',983.83));
// "Открываем" данные с использованием специального выходного потока
$fo = fopen ('php://output', 'w');
echo "<table style = 'border: 1px solid silver'>";
// В цикле проходимся по каждому элементу исходного массива
foreach ($sales as $sales_line)
{
echo "<tr><td style = 'border: 1px solid silver'>";
if (fputcsv($fo, $sales_line) === false)
{
die ("Ошибка при выводе строки CSV");
}
echo '</td></tr>';
}
echo '</table>';
// Закрываем "файл" после окончания вывода на экран
fclose($fo);
Что мы делаем в этом коде после объявления массива?
Для вывода на экран нужно использовать так называемый "выходной поток" - php://output. Далее мы создаем простенькое форматирование для вывода данных в виде таблицы и, как и в первом случае, запускаем цикл foreach.
Как вы видите, все делается аналогично, только другое сообщение об ошибке. Внутри каждой итерации цикла мы закрываем ячейку и строку таблицы, а саму таблицу закрываем уже за пределами цикла, когда все данные будут выведены на экран.
В конце, после вывода на экран, закрываем "файл".
Вот и все - с обеими задачами мы справились легко и элегантно. Разумеется, во втором примере вы можете создать красивое html-оформление для выводимой информации, а не довольствоваться таблицей с серой рамкой:)
На этом все, успехов вам!
С уважением, Дмитрий
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также:


















