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

Как выгрузить данные из n8n в CSV и проверить файл

Получите десять записей из API, создайте CSV через Convert to File и проверьте скачанную таблицу. Готовый workflow, UTF-8, BOM и ошибки.

n8n JSON CSV

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

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

Соберём новый workflow: Manual Trigger → Get Posts → Check List → Split Posts → Build Rows → Export CSV → Read CSV. Отдельная ветка Reject List останавливает неподходящий ответ. На выходе Export CSV будет файл posts-user-1.csv, а Read CSV покажет десять прочитанных строк с колонками post_id, user_id, title и body_length.

Это учебная выгрузка из публичного JSONPlaceholder с вымышленными данными. Модель, API-ключ и регистрация в стороннем сервисе не нужны. Ничего не отправляем клиентам и не меняем в CRM. CSV содержит значения и названия колонок, но не оформление, листы и формулы книги Excel.

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

  • Запущенный n8n и доступ в редактор. Инструкция проверена на локальной версии 2.42.4.
  • Доступ к интернету у самого n8n для одного запроса к учебному API.
  • Новый пустой workflow: существующие схемы не изменяйте.
  • Для проверки скачанного файла в Windows - PowerShell. Excel для выполнения инструкции не обязателен.

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

Разобраться с массивом и Split Out

Шаг 1. Проверьте источник данных

В PowerShell выполните запрос ниже. Он читает публикации учебного пользователя 1. В нашей проверке API ответил HTTP 200 и массивом из десяти объектов с id от 1 до 10.

powershell
curl.exe --include --max-time 20 "https://jsonplaceholder.typicode.com/posts?userId=1"

Если запрос не проходит, сначала проверьте сеть и адрес. Сеть на компьютере и у контейнера n8n может отличаться. Не отключайте проверку HTTPS-сертификата и не заменяйте ответ искусственными числами ради успешного теста.

Шаг 2. Скачайте готовый workflow

Скачать n8n-csv-export-demo.json

Сохраните полный JSON как файл .json. В нём восемь узлов, нет credentials, паролей и автоматического запуска. Не перепутайте эту схему с самим CSV: файл workflow описывает настройки, а CSV с данными появится только после выполнения.

Шаг 3. Импортируйте схему в пустой редактор

Откройте Overview → Create workflow. Скопируйте полный текст скачанного JSON, щёлкните свободную область пустой схемы и нажмите Ctrl+V. Если в меню More actions есть Import from File, можно использовать его. Проверьте имя ezgpt-csv-export-demo и восемь узлов.

Нажмите Zoom to Fit. У Check List ветка true идёт в Split Posts, затем Build Rows, Export CSV и Read CSV. Ветка false заканчивается Reject List. Не соединяйте её с экспортом.

n8n: импорт workflow

Шаг 4. Проверьте HTTP Request

Откройте Get Posts двойным щелчком по значку узла. Method = GET, Authentication = None. URL:

text
https://jsonplaceholder.typicode.com/posts

Send Query Parameters включён: Name = userId, Value = 1. Не дублируйте параметр в URL. В Options → Response должны быть Response Format = JSON и включённый Include Response Headers and Status. Never Error выключен. Timeout = 15000 мс; Ignore SSL Issues не включайте.

После Execute step в OUTPUT → JSON будет один item с массивом в body. Это не одна публикация: внутри body находятся десять объектов. Здесь используется полный HTTP-ответ; при выключенном переключателе структура изменится.

n8n: HTTP Request

Шаг 5. Проверьте список до создания файла

Откройте Check List - узел If. Значение слева в режиме Expression, тип Boolean, оператор is true. В готовой схеме стоит условие:

javascript
{{ $json.statusCode === 200 && Array.isArray($json.body) && $json.body.length > 0 && $json.body.length <= 10 && $json.body.every(p => p !== null && Number.isSafeInteger(p.id) && p.id > 0 && p.userId === 1 && typeof p.title === 'string' && p.title.trim().length > 0 && typeof p.body === 'string' && p.body.trim().length > 0) }}

Оно принимает HTTP 200 и массив от одной до десяти публикаций пользователя 1. У каждой должны быть положительный целочисленный id и непустые строковые title и body. Если хотя бы одна запись не подходит, весь список отклоняется до экспорта.

Это контракт упражнения, не универсальные правила для вашей CRM. Пустой список здесь намеренно вызывает отказ; в реальной интеграции отсутствие данных может быть нормальным результатом, для которого нужна отдельная ветка. Не выключайте проверку только ради получения файла.

Шаг 6. Подготовьте строки и нужные колонки

В Split Posts выбраны Fields To Split Out = body, Include = No Other Fields, Destination Field Name = post. Узел превращает массив в десять отдельных items. В Build Rows, то есть Edit Fields, оставлены четыре поля в режиме Expression:

  • post_id: Number, {{ $json.post.id }}.
  • user_id: Number, {{ $json.post.userId }}.
  • title: String, {{ $json.post.title }}.
  • body_length: Number, {{ $json.post.body.length }}.

Include Other Input Fields выключен. В Settings не включайте Execute Once. Первая строка Build Rows должна выглядеть так:

json
{
  "post_id": 1,
  "user_id": 1,
  "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
  "body_length": 158
}

Значение body_length - длина текста публикации в единицах строки JavaScript, не число слов или байтов. Выбираем только нужные поля до экспорта: headers, вложенный post и полный текст body не должны попасть в таблицу случайно.

Шаг 7. Настройте Convert to File

Откройте Export CSV. Это узел Convert to File, Operation = Convert to CSV. Put Output File in Field = data. В Options проверьте File Name = posts-user-1.csv, Header Row включён, Delimiter = запятая. В поле разделителя должна быть одна запятая без кавычек и пробелов.

Узел получает десять items и создаёт один файл со всеми строками. Значение data - имя бинарного поля n8n, не путь на диске. File Name задаёт название для скачивания, но сам по себе не сохраняет файл в папку Windows или контейнера. Отдельный цикл здесь не нужен.

n8n: Convert to File

Шаг 8. Выполните цепочку и скачайте CSV

На схеме нажмите Execute workflow. Откройте Export CSV → OUTPUT → Binary. Должен появиться один item с полем data, именем posts-user-1.csv и MIME type text/csv. Нажмите Download и дождитесь сохранения файла. Для Manual Trigger публиковать workflow не требуется.

Начало скачанного файла в текстовом редакторе выглядит так; ниже показаны заголовок и только две из десяти записей:

csv
post_id,user_id,title,body_length
1,1,sunt aut facere repellat provident occaecati excepturi optio reprehenderit,158
2,1,qui est esse,206

Скачивайте Binary в Export CSV, а не JSON результата Read CSV. Если браузер добавил к имени (1), это новый файл рядом со старым. При дальнейшей проверке выберите именно последний скачанный файл.

Скачать проверенный образец posts-user-1.csv

Шаг 9. Прочитайте файл обратно

Откройте Read CSV - узел Extract From File. Operation = Extract From CSV, Input Binary Field = data. В Options: Delimiter = запятая, Encoding = UTF8, Header Row включён, Exclude Byte Order Mark (BOM) включён. Эти настройки уже есть в импортированной схеме.

После полного выполнения откройте OUTPUT → Table. Должно быть десять строк с четырьмя названными колонками. При создании CSV в нашем тесте n8n добавил BOM - невидимую метку кодировки в начале файла. Без её исключения Read CSV включал эту метку в имя post_id, хотя визуально заголовок выглядел нормально.

После чтения значения post_id, user_id и body_length представлены строками. Это ожидаемо для CSV, который не хранит типы JSON. Перед арифметикой преобразуйте число и проверьте его диапазон; не предполагайте, что тип Number сохранился в файле.

n8n: Extract From File

Шаг 10. Проверьте скачанный файл в PowerShell

Откройте PowerShell в папке со скачанным CSV. Если имя отличается, измените первую строку. Import-Csv разбирает записи, включая кавычки и переносы внутри ячеек; обычный подсчёт строк текста для CSV ненадёжен.

powershell
$path = '.\posts-user-1.csv'
$rows = @(Import-Csv -LiteralPath $path -Delimiter ',' -Encoding UTF8)
if ($rows.Count -ne 10) { throw 'Expected 10 records' }
$headers = @($rows[0].PSObject.Properties.Name)
if (($headers -join ',') -ne 'post_id,user_id,title,body_length') { throw 'Unexpected headers' }
$ids = ($rows | ForEach-Object { [int]$_.post_id }) -join ','
if ($ids -ne '1,2,3,4,5,6,7,8,9,10') { throw 'Unexpected post IDs' }
if (@($rows | Where-Object { $_.user_id -ne '1' }).Count -gt 0) { throw 'Unexpected user ID' }
if ($rows[0].body_length -ne '158' -or $rows[-1].body_length -ne '129') { throw 'Check source text lengths' }
$rows | Select-Object -First 1 | Format-List
'OK: 10 records, 4 columns, IDs 1-10'

Для проверенного учебного ответа команда завершается строкой OK. Числа 158 и 129 относятся к текущим текстам JSONPlaceholder: если источник изменится, сравните длины с новым ответом, а не подгоняйте данные. В редакторе также сопоставьте заголовки каждой строки с Build Rows.

Если открываете файл в Excel, импортируйте его через Данные → Из текста/CSV, выберите UTF-8 и разделитель запятую. Двойной щелчок может использовать настройки вашей системы. Не превращайте идентификаторы с ведущими нулями и длинные номера в числа без проверки. Нативное приложение Excel в этом тесте не использовалось.

Шаг 11. Проверьте русский текст и кавычки

В Build Rows временно замените только выражение поля title на следующее. Оно меняет заголовок первой записи на учебный текст, остальные заголовки остаются прежними:

javascript
{{ $json.post.id === 1 ? 'Проверка, "кавычки"\nвторая строка' : $json.post.title }}

Выполните весь workflow снова. В Read CSV первая ячейка title должна содержать русский текст, обычные кавычки и перенос строки. Записей по-прежнему десять. В текстовом CSV эта ячейка записана так:

csv
"Проверка, ""кавычки""
вторая строка"

Это одна ячейка, а не две записи. Не собирайте CSV вручную через join(",") и не удаляйте кавычки из файла: они защищают структуру при запятых и переносах внутри текста. После теста верните title = {{ $json.post.title }}.

Шаг 12. Проверьте отказы и восстановите настройки

В Get Posts временно поставьте userId = 999 и запустите workflow. В нашей проверке API вернул пустой массив, Check List выбрал false, Reject List завершил выполнение ошибкой. Export CSV и Read CSV не должны выполниться в этом новом запуске. Верните userId = 1.

Затем в Read CSV замените Input Binary Field с data на missing и повторите полный запуск. Ожидается ошибка The item has no binary field 'missing'. Верните data. Не переименовывайте поле только в одном из двух узлов.

Наконец выполните исходную схему ещё раз: десять строк в Build Rows, один бинарный файл в Export CSV, десять строк в Read CSV. Скачайте свежий файл и проверьте его командой из шага 10. Старый файл в Downloads и старый OUTPUT после ошибки не доказывают успех нового выполнения.

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

Симптом Что проверить Правильный результат
Все данные в одной колонке Delimiter при чтении и импорте Запятая, четыре колонки
Нет Binary в выходе Узел Export CSV и его выполнение Один файл в поле data
Не найдено поле missing Input Binary Field в Read CSV Совпадает с data в экспорте
Не находится post_id Exclude Byte Order Mark (BOM) Включено, чистое имя колонки
Девять строк вместо десяти Header Row и вход Build Rows Заголовок плюс десять записей
Русский текст нечитаем Кодировка при импорте UTF-8, не ручная перекодировка

Перед выгрузкой настоящих данных

Сначала замените источник и контракт проверки по документации своего API. Лимит в десять элементов здесь останавливает большой ответ, но не загружает следующие страницы и не обрезает массив. Большие выгрузки, расписание и хранение файлов требуют отдельной проверки. Созданный файл находится в данных выполнения n8n: не рассчитывайте на вечный архив без настроенного хранения.

Для другого разделителя, например точки с запятой, измените Delimiter и в Export CSV, и в Read CSV, и в Import-Csv. В нашем отдельном тесте вариант с точкой с запятой также сохранил десять записей. Не меняйте только расширение .csv на .xlsx: получится прежний текстовый файл, а не книга Excel.

Не выгружайте пароли, токены и лишние персональные сведения. Текст из чужой заявки может начинаться с =, +, - или @ и интерпретироваться табличным редактором как формула. Кавычки CSV не являются защитой от этого: для пользовательских полей нужна отдельная политика безопасного экспорта и проверка в целевом приложении. В этом упражнении такой экспорт и защита не реализованы.

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

9 октября 2026 года схема проверена на n8n 2.42.4. Семь сценариев: обычный CSV, пустой ответ, чужой пользователь, объект вместо массива, русский текст с кавычками и переносом, неверное бинарное поле и разделитель точка с запятой. Все 43 автоматические проверки прошли. В локальном редакторе создан новый workflow, выполнена вся цепочка, CSV скачан и байтово совпал с результатом теста; Read CSV вернул десять строк. Существующие workflows не изменялись. Периодические сетевые обрывы потребовали повторных HTTP-запусков без отключения TLS. Cloud, Excel, большие выгрузки, пользовательские формулы, закрытые API и отправка файлов клиентам не тестировались. Обложка - редакционная иллюстрация, не снимок интерфейса.

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

Почему Convert to File возвращает один item, а не десять?

Он объединяет десять входных записей в один CSV. Это ожидаемый результат. Количество записей внутри файла проверяйте через Read CSV или Import-Csv, а не по числу items после экспорта.

Где искать CSV, если OUTPUT → JSON пустой?

Откройте Export CSV → OUTPUT → Binary. Файл находится в бинарном поле data. Пустой JSON не означает отсутствие файла. Кнопка Download сохраняет файл на компьютер, File Name сам по себе не задаёт папку на сервере.

Зачем включать Exclude Byte Order Mark (BOM)?

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

Почему числа после чтения CSV стали строками?

CSV хранит текстовые значения без типов JSON. Перед расчётами преобразуйте нужные поля в числа и проверьте их. Идентификаторы с ведущими нулями и длинные номера лучше оставлять текстом, если это требуется источником.

Можно ли сразу отправлять выгрузку клиенту?

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

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

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