JavaScript读取文本文件合并(C)行到前一行

作者:技术拾光时间:2026-06-18 08:23:10浏览:641

使用Node.js的fs模块读取文本文件,通过逐行解析与合并逻辑,将独立的(C)行内联追加至其前一行末尾。该方法精准区分独立与非独立行,保留原缩进与空行结构,不误伤嵌入式的(C),适用于自动化文本后处理场景。

本文介绍使用 Node.js 的 fs 模块读取文本文件,通过正则表达式定位独立的 (C) 行,将其内联追加至上一行末尾,实现结构化内容重组。适用于自动化生成 TXT 文件后的后处理场景。

在日常的文本后处理过程中,常会遇到一个典型需求:自动生成的 TXT 文件里,某些标注信息(如版权符号 (C))单独占据一行,但理想状态是让它紧跟在前面内容行的末尾。简而言之,需要将独立的 (C) 行合并到其上一行,而非进行简单的全局替换或查找。

直接使用正则替换虽然能够近似实现,但容易引发问题——例如它会匹配所有包含 (C) 的行,并将整行替换为 (C),导致原有行内容丢失,且无法确保“仅合并真正独立的行”。以下方案逻辑更清晰,且能更稳健地处理各类边界情况。

推荐方案:逐行解析 + 合并逻辑

const fs = require('fs');

function mergeCWithParent(filePath) {
  const content = fs.readFileSync(filePath, 'utf8');
  const lines = content.split(/rn/);
  const resultLines = [];

  for (let i = 0; i < lines.length; i++) {
    const line = lines[i].trim();

    // 若当前行为纯 "(C)"(忽略空格),且前一行非空,则合并到前一行
    if (line === '(C)' && resultLines.length > 0 && resultLines[resultLines.length - 1].trim() !== '') {
      const lastLine = resultLines.pop().trim();
      resultLines.push(lastLine + ' (C)');
    } 
    // 其他情况:保留原行(包括空行、含 `(C)` 的非独立行等)
    else if (line !== '(C)') {
      resultLines.push(lines[i]); // 保持原始换行与空白格式
    }
  }

  return resultLines.join('n');
}

// 使用示例
const updatedContent = mergeCWithParent('./myFile.txt');
console.log(updatedContent);
// 可选:写回文件
// fs.writeFileSync('./myFile.txt', updatedContent);

示例输入与输出验证

输入文件 myFile.txt:

Word1
(C)
Word2
Word3

输出结果:

Word1 (C)
Word2
Word3
  • 正确处理空行;
  • 仅合并独立、完整为 (C) 的行;
  • 保留原有缩进与空行结构;
  • 不误伤如 Wor(C)d1 或 Word6 (C) 等嵌入式 (C)。

注意事项

  • 本方案假设 (C) 总是独占一行(前后可含空白)。若遇到变体(如 (C) 或 (C)),可将判断条件改为 line.replace(/s+/g, '') === '(C)' 以兼容。
  • 使用 split(/rn/) 已能同时兼容 Windows (rn) 和 Unix (n) 换行符。
  • 生产环境中应添加错误处理(如用 try/catch 包裹 readFileSync)和文件存在性校验。
  • 如需批量处理多个文件,可封装为异步函数,配合 fs.promises 使用。

该方法逻辑直观、代码可维护性强,精准满足“将独立 (C) 行移动到其直接父行末尾”的语义需求,是 Node.js 自动化文本后处理中的一种可靠实践。