Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: parsing, abstraction

Как организовать поддержку разных форматов Excel-файлов от разных поставщиков, имеющих разные схемы данных?

Вопрос проверяет умение проектировать систему, которая принимает разные форматы файлов с разной структурой.

Короткий ответ

Лучше всего создать абстракцию над обработкой файлов: единый интерфейс парсера и отдельные классы для каждого формата. При импорте определяется поставщик (или формат) файла и выбирается соответствующая стратегия обработки. Это может быть паттерн «Стратегия» или «Фабрика». Система становится расширяемой: добавление нового поставщика — это добавление нового обработчика, без изменения остального кода.

Длинный ответ

Поддержка разных форматов Excel

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

1. Проблема "жёсткой" схемы

Если код парсера ожидает конкретные колонки:

[A] name  
[B] email  
[C] amount

Но поставщик B присылает:

[1] fio  
[2] summa  
[3] contact_email

— обычный парсер сломается.


2. Решение: стратегия обработки (Strategy Pattern)

Определение:

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

Создаётся интерфейс:

php

interface ExcelFormatParser {
    public function parseRow(array $row): array;
}

3. Реализации под каждого поставщика

php

class SupplierAParser implements ExcelFormatParser {
    public function parseRow(array $row): array {
        return [
            'name' => $row['A'],
            'email' => $row['B'],
            'amount' => (float)$row['C'],
        ];
    }
}

class SupplierBParser implements ExcelFormatParser {
    public function parseRow(array $row): array {
        return [
            'name' => $row['fio'],
            'email' => $row['contact_email'],
            'amount' => (float)$row['summa'],
        ];
    }
}

4. Фабрика выбора парсера

php

class ParserFactory {
    public static function forSupplier(string $supplier): ExcelFormatParser {
        return match ($supplier) {
            'A' => new SupplierAParser(),
            'B' => new SupplierBParser(),
            default => throw new Exception("Unknown supplier")
        };
    }
}

5. Потоковая обработка

При обработке больших файлов:

  • определяется поставщик

  • выбирается парсер

  • каждая строка подаётся на вход парсеру

  • результат отправляется в батч-обработку


6. Маппинг колонок как конфигурация

Можно вынести схему в конфиг:

yaml

supplierA:
  name: A
  email: B
  amount: C

И использовать одну универсальную реализацию.

Но для более сложных кейсов лучше отдельные классы.


7. Преимущества подхода

  • легко расширяем

  • каждый формат инкапсулирован

  • нет условных конструкций в коде

  • легко тестировать

  • изменения не ломают другие форматы


8. Вывод

Поддержка множества Excel-форматов достигается через стратегию парсинга: одна абстракция + множество реализаций. Это обеспечивает расширяемость и стабильность импорта.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    7

Навыки

  • PHP

    PHP

Ключевые слова

#parsing

#abstraction

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.