Найти в Дзене

Фильтрация и агрегирование данных в n8n с использованием Python, C++ и JS

Вместо пространного предисловия: Настоящее программирование начинается там, где появляются большие данные. Задача: - Сформировать файл numbers.txt из большого числа случайных чисел от нуля до девяти, считать число чисел равным N=500 000. Числа должны быть записаны построчно, по одному на одной строке, каждая строка заканчивается переводом каретки. - Выбрать из файла все числа меньше двух и больше 7
- Посчитать сумму выбранных чисел
- Записать ответ в файл output.txt
Решение:
Примечание: Опускаем для краткости создание каталога /EX/n_input для данной задачи. Заметим только, что должны быть даны достаточные права для доступа n8n к соответствующему каталогу и его файлам.
Добавляем в блок Execution Code запуск скрипта Python /usr/bin/python /EX/n_input/gen.py Содержимое файла: import random N = 500000 with open("numbers.txt", "w") as file: for _ in range(N): file.write(str(random.randint(0, 9)) + "\n") Добавляем следующий блок для вызова скрипта-обработчика данных: /EX/n_in

Вместо пространного предисловия:

Настоящее программирование начинается там, где появляются большие данные.

Задача:

- Сформировать файл numbers.txt из большого числа случайных чисел от нуля до девяти, считать число чисел равным N=500 000. Числа должны быть записаны построчно, по одному на одной строке, каждая строка заканчивается переводом каретки.

- Выбрать из файла все числа меньше двух и больше 7
- Посчитать сумму выбранных чисел
- Записать ответ в файл output.txt


Решение:


Примечание: Опускаем для краткости создание каталога /EX/n_input для данной задачи. Заметим только, что должны быть даны достаточные права для доступа n8n к соответствующему каталогу и его файлам.

Добавляем в блок Execution Code запуск скрипта Python

/usr/bin/python /EX/n_input/gen.py

-2

Содержимое файла:

import random

N = 500000

with open("numbers.txt", "w") as file:

for _ in range(N):

file.write(str(random.randint(0, 9)) + "\n")

Добавляем следующий блок для вызова скрипта-обработчика данных:

/EX/n_input/summator

-3

Код исходного файла С++ summator.cpp

#include <iostream>
#include <fstream>
#include <string>
#include <cstdint> // For int64_t

int main() {

std::ifstream infile("/EX/n_input/numbers.txt");

if (!infile) {
std::cerr << "Error opening file numbers.txt\n";
return 1;
}

int64_t lcount = 0;
int64_t sum = 0;
std::string line;

while (std::getline(infile, line)) {

try {

lcount ++;
if (!line.empty()) {
int64_t val = std::stoll(line);
if ( val < 2 || val > 7) { sum += val; };
}
} catch (const std::invalid_argument& e) {
std::cerr << "Invalid number in file: " << line << '\n';
return 2;
} catch (const std::out_of_range& e) {
std::cerr << "Number out of range: " << line << '\n';
return 3;
}

}

std::cout << "Lines count:" << lcount << std::endl;
std::cout << "Sum:" << sum << std::endl;
return 0;
}

Компилируем файл

g++ summator.cpp -o summator

Соответственно на следующем шаге вытаскиваем с помощью блока Code

-4

данный код из получения результата в JSON-формате:

const stdout = $input.item.json.stdout || "";
const lines = stdout.split('\n');
let result = {
linesCount: null,
sumOfNumbers: null
};

lines.forEach(line => {
let matchLinesCount = line.match(/Lines count:(\d+)/);
if (matchLinesCount) {
result.linesCount = parseInt(matchLinesCount[1], 10);
}

let matchSum = line.match(/Sum:(\d+)/);
if (matchSum) {
result.sumOfNumbers = parseInt(matchSum[1], 10);
}

});
return [{ json: result }];

Завершаем код блоком No Operation

В итоге получаем по большому файлу numbers.txt ответ как JSON в двумя полями - числом обработанных чисел и интересующей суммой

P.S. Заметим, что стандартными блоками данная задача будет решаться очень медленно