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

Node.js中Map数据写入CSV报错,求文本替换统计方案

解决Map写入CSV报错及完整实现需求方案

看起来你遇到的核心问题有几个:Map的使用方式错误、异步流程没处理好,还有csv-stringify的数据结构不匹配,另外你的代码还没完成读取大TXT文件替换词汇和统计次数的核心逻辑。我来一步步帮你修正:

1. 先排查Map相关的错误

  • 你用map1.set(line)是不对的,Map的set()方法需要传入键和值两个参数,应该是map1.set(line[0], line[1])(假设你的OneLetter.csv里每行是原词汇;替换词汇的结构)。
  • 你在Map还没填充数据的时候就创建了iterator = map1[Symbol.iterator](),这时候遍历肯定拿不到后续填充的内容,应该在Map填充完成后再遍历。

2. 异步流程问题

读取CSV文件是异步操作,你现在的写入CSV代码是同步执行的,这时候Map里还没有数据,而且data数组里只有你手动加的['data1', 'data2', 'data3'],完全没用到Map的内容,这也是导致报错的原因之一。必须把写入和TXT处理的逻辑放到CSV读取完成的回调里。

3. 完整实现需求的修正代码

下面是包含读取CSV生成替换映射、读取大TXT文件替换词汇、统计词汇出现次数、生成新TXT和统计CSV的完整代码:

const fs = require('fs');
const parse = require('csv-parse');
const stringify = require('csv-stringify');

// 配置文件路径
const csvMapFile = 'OneLetter.csv';
const inputTxtFile = 'largeInput.txt'; // 替换成你的大TXT文件路径
const outputTxtFile = 'replacedOutput.txt';
const outputStatsCsv = 'wordStats.csv';

// 存储替换映射和统计结果
const replaceMap = new Map();
const wordCount = new Map();

// 第一步:读取CSV生成替换映射
fs.createReadStream(csvMapFile)
  .pipe(parse({ delimiter: ';' }))
  .on('data', (line) => {
    // 假设CSV每行是 [原始词汇, 替换词汇]
    const [original, replacement] = line;
    if (original && replacement) { // 跳过空行
      replaceMap.set(original.trim(), replacement.trim());
    }
  })
  .on('end', () => {
    console.log('替换映射加载完成');
    // 第二步:读取大TXT文件,替换词汇并统计
    processTxtFile();
  })
  .on('error', (err) => {
    console.error('读取CSV映射文件出错:', err);
  });

// 处理TXT文件的函数
function processTxtFile() {
  // 用流式读取处理大文件,避免内存溢出
  const readStream = fs.createReadStream(inputTxtFile, 'utf8');
  const writeStream = fs.createWriteStream(outputTxtFile);

  let remaining = '';

  readStream.on('data', (chunk) => {
    remaining += chunk;
    let index;
    // 按换行分割处理(也可以按其他分隔符,比如空格,根据你的需求调整)
    while ((index = remaining.indexOf('\n')) !== -1) {
      const line = remaining.slice(0, index);
      remaining = remaining.slice(index + 1);
      processLine(line);
    }
  });

  readStream.on('end', () => {
    if (remaining) {
      processLine(remaining);
    }
    writeStream.end();
    console.log('新TXT文件生成完成');
    // 第三步:生成统计CSV
    generateStatsCsv();
  });

  readStream.on('error', (err) => {
    console.error('读取TXT文件出错:', err);
  });

  // 处理每行文本,替换词汇并统计
  function processLine(line) {
    // 拆分词汇(这里假设词汇是空格分隔,你可以根据实际情况调整拆分规则)
    const words = line.split(/\s+/);
    const replacedWords = words.map(word => {
      const trimmedWord = word.trim();
      // 统计原始词汇出现次数
      if (replaceMap.has(trimmedWord)) {
        wordCount.set(trimmedWord, (wordCount.get(trimmedWord) || 0) + 1);
        return replaceMap.get(trimmedWord);
      }
      return word;
    });
    // 写入替换后的行到新TXT
    writeStream.write(replacedWords.join(' ') + '\n');
  }
}

// 生成统计CSV文件
function generateStatsCsv() {
  // 把Map转换成csv-stringify需要的数组格式
  const data = [];
  // 表头对应你的需求:出现次数、原始词汇、替换词汇
  const columns = {
    count: '# times',
    original: 'Original',
    replacement: 'Short'
  };

  // 遍历统计Map,生成每行数据
  wordCount.forEach((count, original) => {
    data.push({
      count,
      original,
      replacement: replaceMap.get(original)
    });
  });

  // 如果没有统计到数据,加一行空数据避免报错
  if (data.length === 0) {
    data.push({ count: 0, original: '', replacement: '' });
  }

  stringify(data, { delimiter: ';', header: true, columns: columns }, (err, output) => {
    if (err) {
      console.error('生成CSV出错:', err);
      return;
    }
    fs.writeFile(outputStatsCsv, output, (err) => {
      if (err) {
        console.error('写入CSV文件出错:', err);
        return;
      }
      console.log(`${outputStatsCsv} 保存完成`);
    });
  });
}

代码说明

  • 流式处理:用流式读取大TXT文件,避免一次性加载大文件导致内存不足。
  • Map正确使用:replaceMap存储CSV里的替换规则,wordCount统计原始词汇的出现次数。
  • 异步流程控制:只有当CSV映射加载完成后,才开始处理TXT文件;TXT处理完成后,再生成统计CSV。
  • CSV数据匹配:用对象格式的数据配合columns配置,确保csv-stringify能正确生成表头和内容,不会出现undefined的错误。

你原来代码的报错原因

你之前的data.push(['data1', 'data2', 'data3'])和columns配置不匹配,而且没有把Map的内容放到data里,再加上异步执行的问题,导致csv-stringify拿到了不符合要求的数据,所以报错Invalid Record: expect an array or an object, got undefined。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:21:39