n8n表单上传多个文件循环处理&合并

概要

使用n8n表单上传多个文件合并处理

完整流程

在这里插入图片描述

添加节点

  1. 使用On form submission提交上传多个文件
    在这里插入图片描述

  2. 添加Code节点,JavaScrip代码如下,作用是把提交的表单拆成可以循环的数组,注意执行前后的变化,由 1 item (data_0 , data_1)变为 2 items (data, data)
    在这里插入图片描述

let results = [];
for (const item of $input.all()) {
    for (const key of Object.keys(item.binary)) {
        results.push({
            json: item.json,
            binary: { data: item.binary[key] },
        });
    }
}
return results;
  1. 添加Loop Over Items节点,在循环中接入Extract from File节点,Operation选择你上传的文件格式。在On form submission节点最好通过Accepted File Types指定文件格式,否则这里不好控制文件类型。当然也可以自己加入判断节点走不同的流程,这里只展示最简单的配置。
  2. 在循环中添加Code节点,这一步可以对每个文件内容做定制化改造,我这里是处理的xls数据,所以可以自定义列信息。JavaScrip代码如下,不需要的可以忽略这个节点。
    在这里插入图片描述

function getSimpleWeekNumber(date, weekStart = 1) {
  // weekStart: 0=周日, 1=周一
  const firstDay = new Date(date.getFullYear(), 0, 1);
  const firstDayOfWeek = firstDay.getDay();
  // 计算距离本周起始日的天数
  let offset = (firstDayOfWeek - weekStart + 7) % 7;
  // 计算本日期与1月1日所在周的起始日的天数差
  const diffDays = Math.floor((date - firstDay + offset * 24 * 60 * 60 * 1000) / (24 * 60 * 60 * 1000));
  return Math.floor(diffDays / 7) + 1;
}

return $input.all().map(item => {
  const json = item.json;
  const city = $node["Code_1"].json["city"];
  // 匹配 xxxx年月 和 xxxx年日
  const yearMonthKey = Object.keys(json).find(key => key.match(/^\d{4}年月$/));
  const yearDayKey = Object.keys(json).find(key => key.match(/^\d{4}年日$/));
  let year, month, day, week;

  if (yearMonthKey) {
    year = yearMonthKey.slice(0, 4);
    month = json[yearMonthKey];
  }
  if (yearDayKey) {
    // 优先使用年月里的年份
    year = year || yearDayKey.slice(0, 4);
    day = json[yearDayKey];
  }
  week = getSimpleWeekNumber(new Date(year, month - 1, day))

  return {
    json: {
      '城市':city,
      '年': year,
      '月': month,
      '日': day,
      '周':week,
      '凭证号': json['凭证号'],
      '现金流量项目': json['现金流量项目'],
      '摘要': json['摘要'],
      '方向': json['方向'],
      '金额': json['金额']
    }
  };
});

  1. 在Loop的Done节点添加Code,作用是把每个文件生成的JSON转为一个数组对象,方便下一步对合并后的数据进行处理。效果如下:
    在这里插入图片描述
const allItems = $input.all(); // 获取所有文件生成的json

// 先合并为每个key一个数组
const merged = {};
for (const item of allItems) {
  for (const key in item.json) {
    if (!merged[key]) merged[key] = [];
    merged[key].push(item.json[key]);
  }
}

// 转成数组形式,每行一个对象
const result = [];
const len = Object.values(merged)[0].length; // 假设每个key的长度一样
for (let i = 0; i < len; i++) {
  const row = {};
  for (const key in merged) {
    row[key] = merged[key][i];
  }
  result.push(row);
}

return result.map(row => ({ json: row }));

  1. 添加其他节点,如 Filter、Summarize节点对数据进行处理
    在这里插入图片描述

总结

主要是需要把表单提交的多个文件,拆成可循环的数组,再把每个文件数据合并为一个数组的过程。

在 n8n 中,合并多页数据通常涉及处理分页 API 响应或从多个数据源提取数据并进行整合。n8n 提供了多种方式来实现这一目标,包括使用 `Function` 节点、`Merge` 节点以及通过循环和变量管理来处理分页请求。 ### 1. 使用 `Function` 节点处理分页数据 如果数据源支持分页(例如,API 提供了页码或游标参数),可以通过编写 JavaScript 代码在 `Function` 节点中实现分页请求,并将结果合并到一个数组中。以下是一个示例代码片段,演示如何使用 `Function` 节点进行分页请求并合并结果: ```javascript const results = []; for (let page = 1; page &lt;= 5; page++) { const response = await $http.get(`https://api.example.com/data?page=${page}`); results.push(...response.data); } return $set(&#39;combinedData&#39;, results); ``` ### 2. 使用 `Merge` 节点合并多个数据流 当需要从多个独立的数据源获取数据时,可以使用 `Merge` 节点将不同分支的数据流合并为一个输出。例如,从两个不同的 API 获取数据后,使用 `Merge` 节点将结果合并为一个数组。 ### 3. 使用 `Loop` 和 `Set` 节点管理分页逻辑 在某些情况下,分页请求需要动态处理,例如根据响应中的 `nextPageToken` 进行下一页请求。可以通过 `Loop` 节点结合 `Set` 节点来管理分页逻辑,并将每次请求的结果追加到全局变量中。 ### 4. 使用 `Item Lists` 和 `Item Loop` 节点处理多页数据 对于需要逐项处理的场景,可以使用 `Item Lists` 节点生成多个项目,并通过 `Item Loop` 节点对每个项目执行操作。这在处理多个页面或文件时非常有用。 ### 示例工作流结构 1. **HTTP Request** 节点:发送请求获取第一页数据。 2. **Function** 节点:解析响应并提取数据。 3. **Loop** 节点:根据 `nextPageToken` 或页码继续请求后续页面。 4. **Merge** 节点:将所有页面的数据合并为一个数组。 5. **Set** 节点:将合并后的数据存储在工作流上下文中。 通过这些方法,可以在 n8n 中灵活地处理多页数据的合并需求,适用于各种数据集成场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值