You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:45:34