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

如何使用Node.js替换CSV文件双引号内的逗号(含异常引号场景)

Node.js 实现CSV双引号包裹内容内的逗号替换为空格

要实现CSV中双引号包裹内容内的逗号替换为空格,同时兼容双引号内存在单个未转义双引号的不规范场景,推荐用状态机逐字符解析的方式——这种方法比正则表达式更可靠,能精准处理各种边缘情况。

核心处理函数

function replaceCommasInQuotedFields(line) {
  let inQuotes = false;
  const result = [];
  let i = 0;
  
  while (i < line.length) {
    const char = line[i];
    
    if (char === '"') {
      // 检查是否是连续双引号(CSV标准转义)
      if (line[i + 1] === '"') {
        result.push('""');
        i += 2; // 跳过下一个双引号
        continue;
      }
      // 切换引号包裹状态
      inQuotes = !inQuotes;
      result.push(char);
      i += 1;
    } else if (char === ',' && inQuotes) {
      // 引号内的逗号替换为空格
      result.push(' ');
      i += 1;
    } else {
      result.push(char);
      i += 1;
    }
  }
  
  return result.join('');
}

完整文件处理示例

结合Node.js的文件流API,可以高效处理大体积CSV文件:

const fs = require('fs');
const readline = require('readline');

async function processCsvFile(inputPath, outputPath) {
  const rl = readline.createInterface({
    input: fs.createReadStream(inputPath),
    crlfDelay: Infinity // 兼容所有换行格式
  });

  const writeStream = fs.createWriteStream(outputPath);

  for await (const line of rl) {
    const processedLine = replaceCommasInQuotedFields(line);
    writeStream.write(`${processedLine}\n`);
  }

  writeStream.end();
  console.log('CSV文件处理完成');
}

// 调用示例
processCsvFile('./input.csv', './output.csv').catch(err => {
  console.error('处理失败:', err);
});

场景验证

场景1:标准双引号包裹内容

输入:48,"LHT0019","TEST COUNT (HB,TW,DC,PL)"
输出:48,"LHT0019","TEST COUNT (HB TW DC PL)"

场景2:双引号内存在单个未转义双引号

输入:48,"LHT0019","TEST COUNT (HB,TW,"DC,PL)"
输出:48,"LHT0019","TEST COUNT (HB TW DC PL)"

逻辑说明

  • 状态标记:通过inQuotes变量实时标记当前是否处于双引号包裹区域
  • 转义处理:识别CSV标准的连续双引号转义格式,直接保留而不切换状态
  • 精准替换:仅对引号包裹区域内的逗号进行替换,引号外的分隔逗号保持原样
  • 兼容性:支持不规范的单个未转义双引号场景,自动将其视为区域边界处理

内容的提问来源于stack exchange,提问作者Rajat Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:00:46