如何用JavaScript将TXT文件数据转为JSON并按日期和名称分组?
问题描述
我有如下格式的TXT文本数据:
[2023-01-28 17:54:59]Name John, Cart Iphone13 [2023-01-28 17:54:59]Name John, Cart Iphone14 [2023-01-28 17:54:59]Name John, Cart Iphone15 [2023-01-28 17:54:59]Name John, Cart Iphone16 [2023-01-28 18:24:29]Name Frank, Cart Android10 [2023-01-28 18:24:29]Name Frank, Cart Android11
需要用JavaScript将其转换为指定格式的JSON对象,按相同日期和名称分组,期望结果如下:
[ { "date": "2023-01-28 17:54:59", "name": "John", "cart": [ "Iphone13", "Iphone14", "Iphone15", "Iphone16" ] }, { "date": "2023-01-28 18:24:29", "name": "Frank", "cart": [ "Android10", "Android11" ] } ]
解决方案
可以通过正则解析每行数据+对象分组聚合的方式实现,具体代码如下:
// 模拟读取到的TXT文本内容 const txtData = `[2023-01-28 17:54:59]Name John, Cart Iphone13 [2023-01-28 17:54:59]Name John, Cart Iphone14 [2023-01-28 17:54:59]Name John, Cart Iphone15 [2023-01-28 17:54:59]Name John, Cart Iphone16 [2023-01-28 18:24:29]Name Frank, Cart Android10 [2023-01-28 18:24:29]Name Frank, Cart Android11`; // 1. 按行分割文本,过滤空行 const lines = txtData.split('\n').filter(line => line.trim()); // 2. 正则表达式:匹配日期、名称、购物项 const regex = /\[([^\]]+)\]Name (\w+), Cart (\w+)/; // 3. 用对象存储分组数据,键为"日期-名称"组合 const groupMap = {}; lines.forEach(line => { const match = line.match(regex); if (match) { const [_, date, name, item] = match; const key = `${date}-${name}`; if (!groupMap[key]) { groupMap[key] = { date, name, cart: [] }; } groupMap[key].cart.push(item); } }); // 4. 将对象值转为数组,得到最终结果 const result = Object.values(groupMap); // 输出格式化后的JSON console.log(JSON.stringify(result, null, 2));
代码说明
- 文本分割:通过
split('\n')拆分文本为单行数据,filter过滤空行避免无效解析。 - 正则解析:正则表达式精准提取括号内的日期、
Name后的用户名、Cart后的商品项。 - 分组聚合:以“日期-名称”作为唯一键存入对象,避免重复分组;首次遇到分组时初始化结构,后续直接追加商品到
cart数组。 - 结果转换:
Object.values(groupMap)将对象中的分组数据提取为数组,即符合要求的JSON结构。
内容的提问来源于stack exchange,提问作者J Man
相关产品推荐
相关产品推荐

