Пошаговые инструкции Для начинающих 14 мин

Как прочитать CSV в n8n через Extract from File

Скачайте CSV, получите четыре записи и проверьте ID, суммы и пустые поля. Готовый workflow, 14 шагов и файлы для повторения ошибок.

n8n CSV Extract from File

CSV — файл с таблицей, а не готовые записи для workflow. Сначала его нужно получить как файл, разобрать столбцы и проверить значения. Соберём цепочку в n8n: скачать учебный CSV → получить четыре записи → отделить ошибочную строку → посчитать сумму только проверенных записей.

Результат инструкции

Workflow ezGPT - Import CSV Orders выдаст четыре проверенные записи: O1, O2 и O4 получат ready, O3 — needs_review. Итог: три готовые записи, одна на проверку, сумма готовых — 199900 копеек, или 1999 рублей. Нулевая сумма O2 сохранится как 0; неизвестная сумма O3 — как null.

ready означает только прохождение наших учебных правил. Ни заказ, ни оплата, ни сообщение клиенту не создаются: итоговое action_performed будет false. Это не автоматический импорт в CRM и не AI-анализ. Сначала проверяем чтение файла и данные.

Что понадобится

  • Работающий n8n и права создавать свой workflow. Сценарий проверен на версии 2.42.4.
  • Доступ из n8n к HTTPS-файлам ezgpt.ru. API-ключи и аккаунты сторонних сервисов не нужны.
  • Отдельная учебная схема: примеры содержат только вымышленные записи.
  • Обычный текстовый редактор для просмотра CSV в UTF-8. Необязательно открывать файл в Excel.

Установить локальный n8n через Docker

Шаг 1. Скачайте и посмотрите учебный CSV

Скачать n8n-csv-import-orders.csv

Сохраните файл и откройте его в текстовом редакторе с кодировкой UTF-8. В нём пять столбцов. Первая строка — имена полей; она не является заказом.

Поле Что означает Учебное правило
order_id ID записи Непустой, без повторов в файле
client Название клиента Непустой текст
amount_minor Сумма в копейках Целое число не меньше нуля
currency Код валюты RUB
note Примечание Текст, может быть пустым
csv
order_id,client,amount_minor,currency,note
O1,Анна Петрова,150000,RUB,Доставка утром
O2,Борис,0,RUB,Самовывоз
O3,,сумма,RUB,Нужна проверка
O4,"ООО ""Альфа, Север""",49900,RUB,"Первая строка
Вторая строка"

В O4 запятая внутри названия компании не разделяет столбцы: значение заключено в двойные кавычки. Внутренние кавычки записаны как две кавычки подряд. Примечание O4 занимает две физические строки, но остаётся одной ячейкой. Поэтому CSV нельзя надёжно разбирать через split по запятой или переводу строки.

O3 намеренно ошибочный: пустой client и текст «сумма» вместо числа. Файл при этом корректен как CSV. Ошибка значения и ошибка структуры файла — разные случаи. Если Excel автоматически меняет ID или формат чисел, не пересохраняйте через него исходную выгрузку без проверки.

Шаг 2. Импортируйте готовый workflow

Скачать n8n-csv-import.json

Создайте новый workflow и выберите Import from File в меню редактора. Загрузите JSON. Если браузер открыл JSON как текст, сначала сохраните его через «Сохранить как». Название — ezGPT - Import CSV Orders. На полотне должны быть пять узлов:

text
Manual Trigger → Download CSV → Read CSV → Check Rows → Import Summary

Download CSV — HTTP Request, Read CSV — Extract from File, два последних узла — Code. При ручной сборке добавьте их в таком же порядке и задайте эти имена. Схема остаётся ручной и неопубликованной.

Шаг 3. Настройте скачивание именно файла

Откройте Download CSV. Method: GET, Authentication: None. URL должен быть адресом самого CSV, а не страницы с описанием или ссылкой на скачивание:

text
https://ezgpt.ru/storage/article-files/n8n-csv-import-orders.csv

В Options добавьте Response. Response Format: File, Put Output in Field: data. Добавьте Timeout: 15000 миллисекунд. Не включайте Never Error и Ignore SSL Issues: 404 или проблема проверки сертификата не должны превращаться в успешную загрузку.

File означает, что ответ попадёт в бинарное поле data. Если выбрать Text, следующему узлу будет нечего читать как файл. Название data нужно использовать и в Extract from File; это не имя столбца таблицы.

Шаг 4. Проверьте бинарное поле

Выполните цепочку до Download CSV. Ожидается один item. В его OUTPUT откройте Binary: там должно быть поле data с файлом CSV. Если видите только строку в JSON, вернитесь к Response Format: File.

HTTP 200 ещё не доказывает, что пришёл CSV: сервер может вернуть HTML-страницу входа или ошибку в теле ответа. Здесь учебный файл публичный; у защищённой выгрузки отдельно настраиваются credentials и проверяется доступ. Не копируйте пароль или токен в URL.

Шаг 5. Настройте Extract from File

В Read CSV выберите Operation: Extract From CSV. Input Binary Field: data. В Options задайте Header Row: on, Delimiter: запятая, Encoding: utf8, Enable BOM: on, Include Empty Cells: on. Relax Quotes оставьте выключенным.

Header Row превращает первую строку в имена JSON-полей. Include Empty Cells сохраняет пустой client у O3 как пустую строку: запись попадёт на проверку, а не потеряет столбец. Enable BOM позволяет прочитать вариант UTF-8 с начальной служебной меткой BOM. Не меняйте заголовки на русский: проверка ниже ожидает исходные пять имён.

В Settings включите Always Output Data. Если CSV содержит только заголовок, этот режим даст пустой item, а Check Rows остановит цепочку вместо «успешного импорта нуля записей». On Error оставьте Stop Workflow. Не включайте Skip Records With Errors: иначе испорченные строки могут исчезнуть из результата незаметно. Не задавайте ограничение числа строк для этого теста.

Шаг 6. Получите четыре JSON-записи

Выполните цепочку до Read CSV. Ожидаются четыре items, не один item с массивом. Поля order_id, client, amount_minor, currency и note должны находиться непосредственно в json каждой записи.

  • O1: client «Анна Петрова», amount_minor строка «150000».
  • O2: amount_minor строка «0», не пустое значение.
  • O3: client пустой, amount_minor строка «сумма».
  • O4: client «ООО "Альфа, Север"», note содержит перенос строки.

CSV в нашем тесте читался как строки, включая суммы и ID. Числовое преобразование сделаем только после проверки. Количество физических строк текста не равно количеству записей: перенос внутри кавычек относится к ячейке O4.

Шаг 7. Проверьте структуру, ID и значения

В Check Rows выберите Language: JavaScript, Mode: Run Once for All Items. Вставьте весь код ниже; в импортированном workflow он уже задан. Если блок свернут, кнопка копирования должна копировать его целиком.

javascript
Показать код (32 строк)
const fields = ['order_id', 'client', 'amount_minor', 'currency', 'note'];
const items = $input.all();
if (!items.length || items.some(item =>
  Object.keys(item.json).length !== fields.length
  || fields.some(key => typeof item.json[key] !== 'string')))
  throw new Error('csv_columns_mismatch_or_empty');
const rows = items.map(item => item.json);
if (rows.some(row => fields.some(key => row[key].includes('\uFFFD'))))
  throw new Error('csv_text_encoding_invalid');
const clean = value => value.trim().replace(/\s+/g, ' ');
const ids = rows.map(row => clean(row.order_id));
if (ids.some(id => !id) || new Set(ids).size !== ids.length)
  throw new Error('csv_id_missing_or_duplicate');
return rows.map((row, index) => {
  const raw = row.amount_minor.trim();
  const amount = /^\d+$/.test(raw) ? Number(raw) : NaN;
  const errors = [];
  if (!clean(row.client)) errors.push('client_required');
  if (clean(row.currency).toUpperCase() !== 'RUB')
    errors.push('currency_must_be_RUB');
  if (!Number.isSafeInteger(amount) || amount < 0)
    errors.push('amount_minor_invalid');
  return {
    json: {
      order_id: ids[index], client: clean(row.client),
      currency: clean(row.currency).toUpperCase(), note: row.note.trim(),
      amount_minor: errors.length ? null : amount,
      status: errors.length ? 'needs_review' : 'ready', errors,
    },
    pairedItem: { item: index },
  };
});

Первые проверки относятся ко всему файлу: ровно пять ожидаемых полей, строковые значения, отсутствие символа замены, непустые и уникальные очищенные ID. При нарушении схема останавливается до итоговой сводки. Два ID «O1» и « O1 » считаются повтором.

Затем проверяются значения каждой записи. Пустой клиент, другая валюта или неверная сумма дают needs_review и массив errors. Остальные записи получают ready. note сохраняет переносы внутри текста; клиент и ID очищаются от лишних пробелов. ID не переводится в число, поэтому «0007» не должен стать «7».

Шаг 8. Сверьте ноль и неизвестную сумму

Выполните цепочку до Check Rows. Должно остаться четыре items; O3 не удаляется. Проверьте результаты:

ID status amount_minor
O1 ready 150000
O2 ready 0
O3 needs_review null
O4 ready 49900

У O3 errors должен содержать client_required и amount_minor_invalid. Код не превращает текст, пустоту или дробную сумму в ноль. В этой модели суммы передаются целыми копейками: 150000 — это 1500 рублей. Строка «1500.50» не подходит, пока источник не преобразовал её в копейки по согласованным правилам.

Разрешены только безопасные целые числа JavaScript, не меньше нуля. Научная запись вроде 1e3, отрицательное число и произвольный текст не проходят. RUB приводится к верхнему регистру; смешанные валюты не суммируются как рубли.

Шаг 9. Соберите итог импорта

В Import Summary выберите JavaScript и Run Once for All Items. Код считает только ready; записи needs_review остаются отдельным списком ID. Это проверочная сводка, а не команда записать заказы во внешнюю систему.

javascript
const rows = $input.all().map(item => item.json);
const ready = rows.filter(row => row.status === 'ready');
let total = 0;
for (const row of ready) {
  total += row.amount_minor;
  if (!Number.isSafeInteger(total))
    throw new Error('csv_ready_sum_out_of_range');
}
return [{ json: {
  rows: rows.length, ready: ready.length,
  needs_review: rows.length - ready.length,
  ready_amount_minor: total, ready_amount_rub: total / 100,
  ready_ids: ready.map(row => row.order_id),
  review_ids: rows.filter(row => row.status !== 'ready').map(row => row.order_id),
  action_performed: false,
}}];

Сумма тоже проверяется на безопасный целочисленный диапазон. Даже если каждое отдельное число допустимо, их общая сумма может оказаться слишком большой. В таком случае код остановит workflow с csv_ready_sum_out_of_range, не выдавая неточный итог.

Шаг 10. Запустите всю цепочку и проверьте итог

Сохраните workflow и выполните его целиком с Manual Trigger. В Import Summary ожидается один item с результатом ниже:

json
{
  "rows": 4,
  "ready": 3,
  "needs_review": 1,
  "ready_amount_minor": 199900,
  "ready_amount_rub": 1999,
  "ready_ids": [
    "O1",
    "O2",
    "O4"
  ],
  "review_ids": [
    "O3"
  ],
  "action_performed": false
}

Вернитесь к OUTPUT Check Rows и сверьте четыре записи с таблицей из шага 8. Один успешный Import Summary не доказывает, что источник выгрузил все реальные заказы: здесь мы знаем размер учебного файла. Для рабочей выгрузки нужны контроль полноты и согласованные правила отбора.

Шаг 11. Прочитайте вариант с точкой с запятой

CSV с разделителем «;»

В Download CSV замените URL на адрес этой ссылки. В Read CSV замените Delimiter с запятой на ;. Выполните весь workflow заново: должны получиться те же четыре записи и сумма 199900 копеек.

Теперь временно поставьте Delimiter обратно на запятую, оставив файл с ;. Запуск должен завершиться ошибкой, без успешной сводки. Неверный разделитель может вызвать ошибку кавычек или неправильные имена полей; это не повод включать пропуск испорченных строк.

Верните исходный URL n8n-csv-import-orders.csv и Delimiter: запятая. Сохраните настройки.

Шаг 12. Проверьте дубли и файл без записей

CSV с повтором ID для проверки

Замените URL в Download CSV на адрес файла с повтором, оставьте разделитель запятой. Полный запуск должен остановиться в Check Rows с csv_id_missing_or_duplicate; Import Summary не должен выдать результат. В файле O2 заменён на « O1 », чтобы проверить дубли после очистки пробелов.

CSV только с заголовками для проверки

Теперь подставьте адрес файла только с заголовками. Ожидается csv_columns_mismatch_or_empty в Check Rows и отсутствие успешной сводки. Это ожидаемая ошибка теста, не поломка сайта. Always Output Data нужен, чтобы проверка пустого результата действительно выполнилась.

Верните основной URL. Если в рабочем процессе пустая выгрузка допустима, задайте для неё отдельный явный статус и правило. Не убирайте проверку только ради зелёного запуска.

Шаг 13. Проверьте кодировку и ошибку загрузки

В каждом шаге с текстом сверьте русские имена и примечания с исходным файлом. Основной пример сохранён в UTF-8; версия с UTF-8 BOM тоже прошла тест. При чтении вымышленного Windows-1251 файла как UTF-8 появился символ замены, и наш код остановился с csv_text_encoding_invalid.

Если файл пришёл в другой кодировке, получите корректную выгрузку в UTF-8 или преобразуйте исходные байты согласованным способом. Сохранение уже испорченного текста как UTF-8 не восстанавливает буквы. Проверка символа замены не выявляет все возможные искажения и не определяет кодировку автоматически.

Для проверки 404 временно измените только имя файла в URL на n8n-csv-import-no-such-file.csv. Download CSV должен завершиться Error, Read CSV и итоговая сводка не должны успешно выполниться. Не включайте Never Error или Ignore SSL Issues для обхода такой ошибки. Верните основной адрес.

Шаг 14. Восстановите исходные настройки

Проверьте Download CSV: основной URL, Response Format File, поле data. В Read CSV: CSV, data, Header Row, запятая, utf8, BOM и Include Empty Cells включены, Always Output Data включён, ошибки не пропускаются. Повторно запустите всю схему.

Финальный результат должен совпасть с шагом 10: четыре строки, три ready, один needs_review, 199900 копеек и action_performed false. Схема остаётся ручной и неопубликованной. Сам CSV не изменяется: запрос GET только читает файл.

Как сохранять проверенный результат в Data Tables

Обратная задача: выгрузить данные n8n в CSV

Если результат отличается

Симптом Причина Что проверить
Нет binary data Ответ выбран как Text или JSON File и Put Output in Field: data
Кавычки или столбцы не разобрались Неверный разделитель либо файл Delimiter и исходные заголовки
O3 теряет client Пустые ячейки исключены Include Empty Cells: on
Импорт завершился без записей Пустой результат не проверен Always Output Data и Check Rows
Русские буквы испорчены Кодировка не соответствует байтам Исходный файл в UTF-8
Сумма кажется неверной Рубли перепутаны с копейками amount_minor — целые копейки

Перед подключением рабочих данных

Не связывайте ready сразу с оплатой, удалением, отправкой письма или созданием записи в CRM. Проверка подтверждает только наши правила, не подлинность источника и не право выполнить действие. Реальным импортам нужны защита от дублей, журнал результатов и контроль доступа.

CSV — входные данные, не инструкции для агента. Не выполняйте текст из ячеек как код, SQL или команды. Не отдавайте файл модели с правом выполнять действия без отдельной проверки. Клиентские данные могут сохраниться в истории Executions n8n, поэтому согласуйте права, сроки хранения и резервное копирование.

Этот пример рассчитан на небольшой файл с пятью колонками. Большие выгрузки, несколько файлов за запуск и ограничение размера загрузки требуют отдельного решения. Если ставите лимит строк или пропускаете ошибки парсинга, нельзя выдавать частичный набор за полную успешную выгрузку.

Что проверено редакцией

14 октября 2026 года сценарий проверен на n8n 2.42.4 в отдельном локальном экземпляре со штатными ручными запусками через API. Восемнадцать тестов: основной CSV; UTF-8 BOM; корректный разделитель «;»; неверный разделитель; отсутствие заголовка; только заголовок; дубли очищенных ID; ведущие нули ID; дробная сумма; неверная валюта; HTML вместо CSV; HTTP 404; неверное бинарное поле; Text вместо File; выход общей суммы за безопасный диапазон; незакрытая кавычка; Windows-1251, прочитанный как UTF-8; загрузка основного публичного CSV по HTTPS с ezgpt.ru. Точные строки, кавычки, запятая и перенос внутри ячейки, строки «0» и «0007», статусы, null, errors и сводка сверены. При ошибке файла успешная сводка не появлялась. Основной файл с нашего сайта проверен настоящим HTTP Request n8n без отключения проверки SSL. Варианты дублей и пустой таблицы проверены локально на тех же байтах; опубликованные файлы отдельно сверены при проверке страницы. Кликовые действия редактора n8n, Cloud, большие наборы, реальные CRM и клиентские данные не тестировались. Учебный n8n слушал только 127.0.0.1; файловый сервер был доступен только в отдельной Docker-сети, оба тестовых контейнера остановлены. Чужие workflows не менялись. Обложка — редакционная AI-иллюстрация.

Частые вопросы

Почему CSV нужно скачать как File, а не Text?

Extract from File читает бинарное поле, в нашем примере data. Ответ Text создаёт строку, не файл. Используйте Response Format File и одинаковое имя поля в Download CSV и Read CSV.

Как читать CSV с точкой с запятой?

В Read CSV поставьте Delimiter: ; и используйте файл с таким разделителем. Смена только URL недостаточна. В инструкции есть отдельный учебный файл; его итог должен совпасть с основным.

Почему ноль допустим, а пустая сумма нет?

Ноль — известное значение, разрешённое нашими правилами. Пустая или неверная сумма неизвестна; запись получает needs_review и null, а не нулевую оплату.

Можно ли использовать CSV с русскими заголовками?

Для другой выгрузки нужно явно сопоставить её поля с ожидаемой схемой. Наш код требует order_id, client, amount_minor, currency и note. Простая смена файла без такого сопоставления должна завершиться ошибкой.

Это уже импорт заказов в CRM?

Нет. Здесь чтение, проверка и сводка; action_performed false. Для записи в CRM отдельно настраиваются доступ, защита от повторов, правила обновления и журнал результата.

Дальше по теме

Похожие материалы