Задача и предварительные условия

Приведите коды товаров к единому написанию и сохраните последнюю запись каждого кода.

В примере используются демонстрационные данные и настройки. Проверьте ожидаемый результат в своей среде до подключения рабочих получателей. Идентификаторы demo_* условны: выберите собственные учебные подключения или источники в редакторе. JSON ниже показывает структуру блоков и связей, а не готовый архив потока для переноса.

Учебные входные данные

products.csv

SKU;Name
  t01 ;Tea old
T01;Tea new
 c01;Coffee

Блоки, связи и точные настройки

Поясняющая схемаУвеличить ↗05. Нормализация кодов и удаление дублей. Схема примера 05: 4 блока, 3 связи. Идентификаторы узлов и порты настроенной схемы сохранены.
Схема потока 05

Схема примера 05: блоков — 4, связей — 3. Идентификаторы узлов и порты настроенной схемы сохранены.

Добавьте перечисленные блоки в конструкторе, откройте свойства каждого и задайте эти значения. Имена demo_* обозначают учебные источники и подключения.

БлокНастройка
1
Файл
src
  • Роль: source
  • Источник: demo_products
  • Настройки чтения:
    • Лист: CSV
    • Диапазон: A1:B4
    • Первая строка — заголовок: так
    • Разделитель: ;
2
Преобразование текста
text
  • Поля: SKU
  • operations:
      • Тип: trim
      • Тип: upper
  • null: preserve
3
Удаление дублей
dedup
  • Ключи: SKU
  • Сохранить: last
  • comparison: text
  • case_sensitive: так
  • trim: ні
4
Экспорт данных
out
  • Формат: csv
  • Имя файла: products_clean
  • Назначение: download
  • Разделитель: ;
  • Часовой пояс: Europe/Kyiv

Связи портов

  • src out → text in
  • text out → dedup in
  • dedup out → out in
Полная конфигурация схемы в JSON
{
  "version": 3,
  "nodes": [
    {
      "id": "src",
      "type": "file",
      "label": "src",
      "config": {
        "role": "source",
        "source_id": "demo_products",
        "options": {
          "sheet": "CSV",
          "range": "A1:B4",
          "header": true,
          "delimiter": ";"
        }
      }
    },
    {
      "id": "text",
      "type": "text",
      "label": "text",
      "config": {
        "fields": [
          "SKU"
        ],
        "operations": [
          {
            "kind": "trim"
          },
          {
            "kind": "upper"
          }
        ],
        "null": "preserve"
      }
    },
    {
      "id": "dedup",
      "type": "deduplicate",
      "label": "dedup",
      "config": {
        "keys": [
          "SKU"
        ],
        "keep": "last",
        "comparison": "text",
        "case_sensitive": true,
        "trim": false
      }
    },
    {
      "id": "out",
      "type": "export",
      "label": "out",
      "config": {
        "format": "csv",
        "filename": "products_clean",
        "destination": "download",
        "delimiter": ";",
        "timezone": "Europe/Kyiv"
      }
    }
  ],
  "edges": [
    {
      "source": "src",
      "target": "text",
      "source_port": "out",
      "target_port": "in"
    },
    {
      "source": "text",
      "target": "dedup",
      "source_port": "out",
      "target_port": "in"
    },
    {
      "source": "dedup",
      "target": "out",
      "source_port": "out",
      "target_port": "in"
    }
  ]
}

Ожидаемый результат

SKUИмя
T01Tea new
C01Coffee

Из 3 входных строк остаются две. «Последняя» означает последнюю в текущем порядке входа, а не самую новую по дате.

Запуск и проверка

  1. Загрузите products.csv без предварительного ручного удаления пробелов.
  2. Порядок операций: trim, затем upper, затем удаление дублей по SKU.
  3. Проверьте, что Tea old удалена, Tea new осталась, а c01 стал C01.

Частые ошибки

  • Удаление дублей до нормализации сохранило бы оба варианта t01/T01.
  • keep=unique удалил бы все строки повторяющегося ключа; это другая задача.
  • Если порядок источника нестабилен, keep=last не гарантирует самую новую бизнес-запись.