Основные моменты статьи:

Часто в работе проекта необходимо использовать экспорт и импорт данных. Существует множество способов импортировать и экспортировать данные. Рассмотрим пример импорт/экспорта данных с помощью CSV файлов.

Для начала давайте разберемся что же такое CSV файл. CSV - текстовый формат, предназначенный для представления табличных данных. Одна строка файла - это одна строка в таблице. Значение колонок в файле разделяется специальным символом (разделителем). Обычно в качестве разделителя выступает запятая (,) или точка с запятой (;). Для использования зарезервированных значений (двойная кавычка, запятая, точка с запятой, новая строка) в строке их необходимо заключить в двойные кавычки(").

Пример CSV файла

Название товара;Артикль;Цена;Описание;Количество;Производитель
Windows 10;00001;2000;Microsoft Windows - семейство проприетарных операционных систем корпорации Microsoft;20;Microsoft
USB Flash Drive;20021;500;Запоминающее устройство нового поколения;100;Samsung
Dell x-01;200232;1000;Ноутбук dell;10;Dell
Dell od-1;3449;700;Монитор dell;15;Dell
Asus x50m;4290;500;Ноутбук Asus;3;Asus

Импорт из CSV

Для импорта из CSV необходимо всего пару строк кода и стандартная php функция fgetcsv. Пример:

<?php

    //...

    $r = 0;
    // $pathTofile - путь к файлу и его имя, 1000 - длина, ; - разделитель
    while (($row = fgetcsv($pathTofile, 1000, ";")) != FALSE){
    $r++;
        //if($r == 1) {continue;} // Не импортируем первую строку (например, если там заголовки)
        //записываем данные в БД
        $ins="INSERT INTO `table_to_import` (`name`, `cost`, `count`) VALUES ('$row[0]', '$row[2]', '$row[4]')";
        mysql_query($ins);
   }
   fclose($file);

   //...

fgetcsv() - читает строку из файла и производит разбор данных CSV. Подробнее об fgetcsv() можно посмотреть здесь: http://php.net/manual/ru/function.fgetcsv.php.

Подробный пример импорта с использованием Yii Framework:

<?php

class ImportController extends Controller {

    //...

    /**
    * Импорт товаров из csv файла
    */
    public function actionImportCSV() {
        //путь к файлу
        $this->pathToFile = Yii::getPathOfAlias('webroot') . '/path/to/file.csv';
        //файл можно загрузить с помощью формы

        if (!file_exists($this->pathToFile) || !is_readable($this->pathToFile)) {
            //... код, если файл отсутствует
        }
        $data = array();
        if (($handle = fopen($this->pathToFile, 'r')) !== false) {
            $i = 0;
            while (($row = fgetcsv($handle, 1000, $this->delimiter)) !== false) {
                $model = new Goods();
                $model->name = $row[0];
                $model->article = $row[1];
                $model->cost = $row[2];
                $model->description = $row[3];
                $model->count = $row[4];
                $model->producer = $row[5];
                if ($model->validate()) {
                    $model->save();
                } else {
                    //... код в случае ошибки сохранения
                }
            }
            fclose($handle);
        }
        //... код после импорта
    }

    //... код

}

Экспорт в CSV

Экспорт из БД (или любого другого источника) еще проще. Пример экспорта в CSV:

<?php

class ExportController extends Controller {

    //...

    /**
    * Экспорт товаров в csv файла
    */
    public function actionExportCSV() {
        $data = "Название товара;Артикль;Цена;Описание;Количество;Производитель\r\n";
        $model = Goods::model()->findAll();
        foreach ($model as $value) {
            $data .= $value->name.
                    ';' . $value->article .
                    ';' . $value->cost .
                    ';' . $value->description .
                    ';' . $value->count .
                    ';' . $value->producer .
                    "\r\n";
        }
        header('Content-type: text/csv');
        header('Content-Disposition: attachment; filename="export_' . date('d.m.Y') . '.csv"');
        //echo iconv('utf-8', 'windows-1251', $data); //Если вдруг в Windows будут кракозябры
        Yii::app()->end();
    }

    //... код

}

Вот и все, удачного импорта/экспорта данных с использованием формата CSV.