Архив исходного CSV: проверить заголовок и сохранить файл целиком

Фактические данные получены через расширение interbase от отдельной локальной базы Firebird. Собственная учебная таблица удалена после наблюдений.

Наблюдаемый результат программы
НаблюдениеРезультат
Файл в архивеincoming.csv
Заголовок сохранёнid;title;qty
Товарных строк3
Название с разделителемКабель; USB
Нулевой остаток0
Сумма количеств15
Байт полного файла76
Исходные байты совпалида
Файл закрыл вызывающий кодда
Строки и дополнительные наблюдения
{
    "file_name": "incoming.csv",
    "header": [
        "id",
        "title",
        "qty"
    ],
    "products": [
        {
            "id": 701,
            "title": "Кабель; USB",
            "qty": 3
        },
        {
            "id": 702,
            "title": "Клемма",
            "qty": 0
        },
        {
            "id": 703,
            "title": "Лента",
            "qty": 12
        }
    ],
    "quantity_total": 15,
    "source_bytes": 76,
    "saved_bytes": 76,
    "sha256": "ba8bc45a537156cd2e1f5ec4bac26e46448c7661feb8d06db23e51cb45cfe5e1",
    "position_after_header": 13,
    "position_after_import": 76,
    "raw_archive_is_not_product_insert": true
}

Самостоятельный запуск создаёт result.json с данными и metrics.json с проверками рядом с example.php.