Node.js如何基于customerid读取并合并两个txt文件的数据
代码问题排查
你写的代码存在4个核心问题,导致无法输出预期结果:
- 读取文件后拿到的是原始字符串,没有解析为可操作的JavaScript对象数组,直接遍历字符串只会拿到单个字符,根本访问不到对象属性
- 第二个文件名拼写错误,代码里写的是
file2.text,实际文件后缀是.txt,运行时会直接抛出文件不存在的错误 - 关联字段写错,两个文件的公共关联字段是
customerid,判断条件里写的x.id === y.id不存在对应字段,永远匹配不到;另外file2第一条数据的customerid字段名前带多余空格,直接解析后字段名带前置空格,也会导致匹配失败 - 双重嵌套循环的写法时间复杂度为O(n*m),数据量稍大时性能很差,用哈希映射做关联时间复杂度只有O(n+m),效率高很多
可运行完整代码
注意你文件里存储的是单引号、带多余符号的非标准类JSON格式,不能直接用JSON.parse解析,需要先做格式清洗:
const fs = require('fs'); // 读取两个文件内容,修正文件名拼写 const content1 = fs.readFileSync('file1.txt', 'utf8'); const content2 = fs.readFileSync('file2.txt', 'utf8'); // 工具函数:把文件内的非标准类JSON字符串转成JS对象数组 function parseFileContent(str) { let cleanStr = str.trim().replace(/;$/, ''); // 去掉首尾空白、末尾多余分号 cleanStr = cleanStr.replace(/'/g, '"'); // 单引号替换为双引号,符合JSON格式要求 cleanStr = cleanStr.replace(/"\s*([^"]+?)\s*"/g, '"$1"'); // 清除字段名前后的多余空格 return JSON.parse(cleanStr); } const arr1 = parseFileContent(content1); const arr2 = parseFileContent(content2); // 基于customerid合并两个数组 function mergeByCustomerid(arr1, arr2) { // 先把arr2转为以customerid为键的哈希表,减少匹配耗时 const arr2Map = new Map(); arr2.forEach(item => arr2Map.set(item.customerid, item)); return arr1.map(item1 => { const matchItem = arr2Map.get(item1.customerid); return matchItem ? {...item1, ...matchItem} : item1; }); } const mergedResult = mergeByCustomerid(arr1, arr2); console.log(mergedResult);
输出说明
运行后得到的合并数组单条数据结构和你预期完全一致:
{ customerid: 12, name: 'xyz', email: 'test@gmail.com', vachilenum: 26789, price: 390900920, phone: 673648494894 }
如果需要保留仅在file2中存在、file1没有对应customerid的数据,可以在遍历完arr1后,再遍历哈希表把未匹配到的项补入结果即可。如果你的文件本身存的是标准双引号JSON格式,可以跳过格式清洗步骤直接用JSON.parse解析。
内容的提问来源于stack exchange,提问作者VARUN
相关产品推荐
相关产品推荐

