Наше прошлое 20072009201120132014
г. Москва, ул. Гостиничная, д. 7А. кор.2
8 (499) 404-26-56
пн-пт 11:00 - 19:00
 

Чтение и запись в CSV на PHP

Обычно если стоимость создания интернет магазина достаточно высока, заказчики просят сделать импорт товаров из их прайс листов. Им необходимо чтобы была возможность не только добавлять новый товар на сайт, но и обновлять цены и количество на складе уже существующих товаров.

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

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

Для примера сделаем небольшую программку. Она будет обрабатывать csv-файл сотрудников компании OX2.ru.

Создадим новую таблицу в Excel, содержащую следующие поля:

Сохраним таблицу как csv-файл, с разделителем поля «;».

У нас должен получиться такой файл:

"Иванов А.А.";"Программист компании OX2.ru";89255552332
"Сидоров А.Е.";"Дизайне компании OX2.ru";89161231212
"Пирожков А.Б.";"Арт-директор OX2.ru";84951232121
"Кулибин Б.А.";"Менеджер OX2.ru";89031233333
    

Ниже приведен исходный код с подробным описанием.

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

Так же в коде используется генерация исключений (Exception), о них читайте в следующих наших статьях.

<?php

/**
 * Класс для работы с csv-файлами 
 * @author дизайн студия ox2.ru  
 */
class CSV {

    private $_csv_file = null;

    /**
     * @param string $csv_file  - путь до csv-файла
     */
    public function __construct($csv_file) {
        if (file_exists($csv_file)) { //Если файл существует
            $this->_csv_file = $csv_file; //Записываем путь к файлу в переменную
        }
        else { //Если файл не найден то вызываем исключение
            throw new Exception("Файл "$csv_file" не найден"); 
        }
    }

    public function setCSV(Array $csv) {
        //Открываем csv для до-записи, 
        //если указать w, то  ифнормация которая была в csv будет затерта
        $handle = fopen($this->_csv_file, "a"); 

        foreach ($csv as $value) { //Проходим массив
            //Записываем, 3-ий параметр - разделитель поля
            fputcsv($handle, explode(";", $value), ";"); 
        }
        fclose($handle); //Закрываем
    }

    /**
     * Метод для чтения из csv-файла. Возвращает массив с данными из csv
     * @return array;
     */
    public function getCSV() {
        $handle = fopen($this->_csv_file, "r"); //Открываем csv для чтения

        $array_line_full = array(); //Массив будет хранить данные из csv
        //Проходим весь csv-файл, и читаем построчно. 3-ий параметр разделитель поля
        while (($line = fgetcsv($handle, 0, ";")) !== FALSE) { 
            $array_line_full[] = $line; //Записываем строчки в массив
        }
        fclose($handle); //Закрываем файл
        return $array_line_full; //Возвращаем прочтенные данные
    }

}

try {
    $csv = new CSV("ox2.csv"); //Открываем наш csv
    /**
     * Чтение из CSV  (и вывод на экран в красивом виде)
     */
    echo "<h2>CSV до записи:</h2>";
    $get_csv = $csv->getCSV();
    foreach ($get_csv as $value) { //Проходим по строкам
        echo "Имя: " . $value[0] . "<br/>";
        echo "Должность: " . $value[1] . "<br/>";
        echo "Телефон: " . $value[2] . "<br/>";
        echo "--------<br/>";
    }

    /**
     * Запись новой информации в CSV
     */
    $arr = array("Антонов Б.А.;Админ OX2.ru;89031233333",
        "Колобков В.Б.;Босс OX2.ru;89162233333");
    $csv->setCSV($arr);
}
catch (Exception $e) { //Если csv файл не существует, выводим сообщение
    echo "Ошибка: " . $e->getMessage();
}
?>

Основную работу с CSV файлами на себя берет класс CSV , Он имеет следующие методы:

setCSV(Array $csv) - записывает данные в csv-файл. Данные должны быть переданы массивом. Метод может дозаписывать csv файл, и создавать новый (читайте в описании).

Метод getCSV читает данные из csv файла, и возвращает двумерный массив следующего вида:

Array
(
    [0] => Array
        (
            [0] => Иванов А.А.
            [1] => Программист компании OX2.ru
            [2] => 89255552332
        )

    [1] => Array
        (
            [0] => Сидоров А.Е.
            [1] => Дизайне компании OX2.ru
            [2] => 89161231212
        )

    [2] => Array
        (
            [0] => Пирожков А.Б.
            [1] => Арт-директор OX2.ru
            [2] => 84951232121
        )

    [3] => Array
        (
            [0] => Кулибин Б.А.
            [1] => Менеджер OX2.ru
            [2] => 89031233333
        )

)
    

Пример достаточно простой, несмотря на то что получилось достаточно много кода.

Скачать исходник

И дальше с помощью цикла foreach обходим массив, и выводим в красивом виде содержимое csv файла.

Импорт данных из csv файлов будет полезен не только для обновление товаров в интернет-магазинах, но и для подгрузки/обновлении какой-либо информации на обычный сайт.

Например, мы разрабатывали сайт управляющей компании, и им требовалось ежемесячно публиковать информацию по счетчикам горячей и холодной воды. Все данные у них храняться в excel файлах. И тут прекрасно подошел csv формат!

При этом стоимость создания сайта останется не изменой, а функционал и автоматизация сайта будет на уровень выше чем у конкурентов.

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

Комментарии (Написать комментарий)

Александр [03.12.2015]

Комментарий:
Огроменное спасибо!!

Заполните все поля

Написать комментарий

Ваше имя

Комментарий