Node.js中CSV分隔符替换:保留地址列逗号,将,改为|
解决CSV分隔符替换问题:保留地址列内部逗号
你的核心问题是全局替换逗号会误改地址列里的分隔符,结合第一列固定长度、状态列是固定枚举值(Passed/Not Passed)的特征,可以用以下两种方法解决:
方法一:按行拆分处理(更直观)
思路:
- 每行先拆分出固定长度的第一列
- 拆分出第二列(从第一列结束到第二个逗号)
- 剩下的部分保留地址列内部逗号,仅替换状态列前后的逗号
代码示例:
const fs = require('fs'); // 将require提到循环外,避免重复加载 files.forEach(path => { console.log('File Path => ' + path); let counter = 0; fs.readFile(path, 'utf8', function(err, data) { if (err) return console.log(err); // 优先处理读取错误 const lines = data.split('\n').filter(line => line.trim() !== ''); // 按行分割并过滤空行 const formattedLines = lines.map(line => { // 第一列长度固定,根据你的实际数据调整数值(示例中第一列是16位) const firstColLength = 16; const firstCol = line.slice(0, firstColLength); const restAfterFirstCol = line.slice(firstColLength + 1); // 跳过第一列后的逗号 // 拆分第二列和剩余的地址+状态+日期部分 const secondColEndIndex = restAfterFirstCol.indexOf(','); const secondCol = restAfterFirstCol.slice(0, secondColEndIndex); let addressStatusDate = restAfterFirstCol.slice(secondColEndIndex + 1); // 替换地址列之后的逗号,同时计数 let lineCounter = 0; addressStatusDate = addressStatusDate.replace(/,(?=(Passed|Not Passed)|.*,(Passed|Not Passed))/g, () => { lineCounter++; return '|'; }); counter += lineCounter + 2; // 加上前两个分隔符的替换次数 return `${firstCol}|${secondCol}|${addressStatusDate}`; }); const formatted = formattedLines.join('\n'); console.log(`${counter} 个分隔符已成功替换`); fs.writeFile(path, formatted, 'utf8', function(err) { if (err) return console.log(err); }); }); });
方法二:正则表达式直接替换(更简洁)
利用正则的正向/反向预查,精准定位需要替换的逗号,避免误改地址列内部的逗号:
代码示例:
const fs = require('fs'); files.forEach(path => { console.log('File Path => ' + path); let counter = 0; fs.readFile(path, 'utf8', function(err, data) { if (err) return console.log(err); // 正则匹配四类需要替换的逗号: // 1. 第一列后的逗号:^.{16}, // 2. 第二列后的逗号:(?<=^.{16},[^,]+), // 3. 状态列前的逗号:,(?=(Passed|Not Passed)) // 4. 状态列后的逗号:(?<=(Passed|Not Passed)), const formatted = data.replace(/^.{16},|(?<=^.{16},[^,]+),|,(?=(Passed|Not Passed))|(?<=(Passed|Not Passed)),/g, () => { counter++; return '|'; }); console.log(`${counter} 个分隔符已成功替换`); fs.writeFile(path, formatted, 'utf8', function(err) { if (err) return console.log(err); }); }); });
关键注意事项:
- 请根据你的实际第一列长度,调整代码中
16这个数值(数清楚第一列的字符数即可) - 两种方法都补充了错误处理逻辑,避免文件读写失败时程序崩溃
内容的提问来源于stack exchange,提问作者WALL-E
相关产品推荐
相关产品推荐

