Универсальный импорт товаров из CSV, Excel, XML, JSON

Реализация импорта товаров из файлов поставщика (CSV/Excel/XML/JSON)

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Универсальный импорт товаров из CSV, Excel, XML, JSON
Средний
~5 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1422
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1287
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    984
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1249
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    986
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    1000

Реализация импорта товаров из файлов поставщика (CSV/Excel/XML/JSON)

Мы сталкиваемся с тем, что поставщики присылают прайс-листы в том формате, который удобен им: кто-то в Excel, кто-то в XML, кто-то в CSV с нестандартным разделителем. Мы решаем задачу построения универсального импорта товаров, работающего с любым форматом через единый интерфейс без отдельного кода под каждого поставщика. На одном проекте мы интегрировали прайсы от 15 разных поставщиков, каждый со своей структурой колонок. За смену обрабатывалось до 500 000 строк — ручная загрузка была невозможна. Решение — универсальный парсер с фабрикой и маппингом полей, который сократил время разработки на 60% и позволил подключать нового поставщика за 2 часа. Правильная архитектура импорта окупается уже на третьем поставщике.

Почему универсальный интерфейс парсера — ключ к масштабированию?

Единый интерфейс FileParserInterface позволяет подключать новые форматы без изменения логики импорта. Фабрика выбирает парсер по расширению или MIME-типу. Например, для CSV используем настраиваемый разделитель и кодировку, для XML — потоковый XMLReader, который в 10 раз экономит память по сравнению с SimpleXML. Добавление нового формата сводится к написанию одного класса и регистрации в фабрике.

interface FileParserInterface { /** @return iterable<array<string, mixed>> */ public function parse(string $filePath): iterable; public function supports(string $mimeType, string $extension): bool; } 
class FileParserFactory { private array $parsers; public function make(string $filePath): FileParserInterface { $ext = strtolower(pathinfo($filePath, PATHINFO_EXTENSION)); $mime = mime_content_type($filePath); foreach ($this->parsers as $parser) { if ($parser->supports($mime, $ext)) return $parser; } throw new \RuntimeException("No parser for: {$ext} / {$mime}"); } } 

Как обрабатывать CSV с нестандартными разделителями и кодировками?

CSV — самый непредсказуемый формат. Разделители: запятая, точка с запятой, табуляция. Кодировки: UTF-8 с BOM или без, Windows-1251. Наш парсер настраивается под каждый источник: автоматически детектим BOM, конвертируем Windows-1251 в UTF-8, а нестандартные разделители обрабатываются через настройки. Пример:

class CsvParser implements FileParserInterface { public function __construct( private string $delimiter = ',', private string $enclosure = '"', private bool $hasHeader = true, ) {} public function parse(string $filePath): iterable { $handle = fopen($filePath, 'r'); $bom = fread($handle, 3); fclose($handle); if ($bom === "\xEF\xBB\xBF") { $filePath = $this->removeBom($filePath); } $handle = fopen($filePath, 'r'); $headers = $this->hasHeader ? fgetcsv($handle, 0, $this->delimiter, $this->enclosure) : null; while ($row = fgetcsv($handle, 0, $this->delimiter, $this->enclosure)) { if (!array_filter($row)) continue; yield $headers ? array_combine($headers, $row) : $row; } fclose($handle); } public function supports(string $mimeType, string $extension): bool { return in_array($extension, ['csv', 'txt']) || str_contains($mimeType, 'csv'); } } 

Для файлов больше 10 МБ используем потоковое чтение, снижающее потребление памяти в 3–5 раз. Как отмечается в документации PhpSpreadsheet, чтение в потоковом режиме снижает потребление памяти до 70%. Excel-файл на 200 МБ с setReadDataOnly(true) обрабатывается за 40 секунд на типичном VPS.

Обработка больших Excel и XML файлов

Для Excel используем PhpSpreadsheet с опциями снижения памяти. Для XML — потоковый XMLReader. Сравнение:

Парсер Потоковый? Потребление памяти Скорость Подходит для файлов >100 МБ
XMLReader Да Низкое Высокая Да
SimpleXML Нет Высокое Средняя Нет
JsonMachine Да Низкое Высокая Да
PhpSpreadsheet (по умолчанию) Нет Высокое Средняя Нет
PhpSpreadsheet (setReadDataOnly) Частично Среднее Средняя Да (до 500 МБ)

Потоковый XML-парсер обрабатывает файлы в 10 раз быстрее, чем загрузка всего документа через SimpleXML. Это критично, когда поставщик присылает прайс на 1 миллион позиций. На тесте с файлом 500 МБ потоковый парсер обработал 1 млн записей за 90 секунд.

Обеспечение целостности данных

Каждая строка проходит валидацию перед записью в БД. Невалидные строки (нехватка обязательных полей, некорректный SKU) логируются и не прерывают импорт. Повторный импорт не создаёт дубликатов — используем upsert по ключу SKU. Для контроля целостности сохраняем хеш строки и дату последнего обновления.

Маппинг колонок устраняет рутину

Каждый поставщик использует свои названия колонок. Конфигурация маппинга хранится в БД и редактируется через админку:

{ "sku": "Артикул", "name": "Наименование", "price": "Цена руб.", "qty": "Кол-во", "description": "Описание", "category": "Раздел" } 

Трансформатор применяет маппинг перед передачей в импортёр. Благодаря конфигурации в БД настройка нового поставщика занимает 30 минут вместо 4 часов. Поддерживаются разные маппинги для разных поставщиков.

Что входит в работу

  • Разработка парсеров под все форматы (CSV, Excel, XML, JSON).
  • Настройка маппинга колонок для каждого поставщика.
  • Создание UI для управления маппингом и просмотра логов.
  • Тестирование на реальных файлах (до 1 млн строк).
  • Документация по архитектуре и добавлению новых форматов.
  • Обучение операторов работе с админкой.
  • Техническая поддержка на этапе интеграции.

Процесс внедрения

  1. Анализ форматов файлов поставщиков и требований к маппингу.
  2. Разработка базовых парсеров и pipeline импорта.
  3. Настройка маппинга и потоковой обработки.
  4. Интеграционное тестирование с выгрузкой поставщика.
  5. Деплой на боевой сервер и запуск в работу.

Сроки реализации

Этап Срок
CSV + Excel парсеры, маппинг, базовый pipeline от 2 дней
XML (потоковый) + JSON + автодетект формата +1 день
Конфигурация в UI, кодировки, обработка ошибок +1 день

Итого: от 3 до 4 дней на базовую интеграцию. Срок варьируется от количества форматов и сложности маппинга.

Свяжитесь с нами для оценки вашего проекта — мы подготовим коммерческое предложение за один день. Закажите внедрение универсального импорта и забудьте о ручной загрузке прайсов.