Ruby实现双文本文件操作:第一文件指定n行后插入第二文件内容求助
本地文本行插入操作实现
核心操作目标
针对两个本地文本文件,实现无内容丢失的文本拼接:在第一个文件的指定第n行位置之后,完整插入第二个文件的全部内容,第一个文件中原有的所有内容都不能被覆盖丢失。
原有实现思路
预设的执行流程:
- 将第一个文件中第n行之后的所有文本复制存入变量暂存
- 清除第一个文件中第n行之后的全部内容
- 将第二个文件的全部内容追加到裁剪后的第一个文件末尾
- 在刚插入的第二个文件内容之后,把最开始暂存的原文件n行之后的内容重新写入,完成全量拼接
目前的卡点是:无法精准实现「删除第一个文件中第n行之后所有行」的操作,现有尝试编写的代码存在逻辑偏差。
现有尝试编写的代码
num= open('H:/1.txt').read.count("\n") #looking for the number of lines in the file enum = IO.foreach(File.join("H:/1.txt")) f = File.open("H:/1.txt") n = 3 #the string n c to copy to the variable lines = [] until n>num do lines<< enum.take(n)[-1] n +=1; end p lines
代码存在的问题
- 行数统计偏差:用
read.count("\n")统计行数时,若文件最后一行没有换行符,会比实际行数少算1行 - IO对象使用错误:
IO.foreach是行迭代器,不支持直接调用take方法完成逐行截取 - 收集逻辑冗余:循环中每次都调用
enum.take(n)[-1],配合n逐次自增的逻辑,会导致内容收集完全不符合预期
可直接复用的实现代码(Ruby版本,匹配现有代码的技术栈)
# 配置参数 target_file_path = "H:/1.txt" insert_file_path = "H:/2.txt" insert_pos_after_line = 3 # 表示在原文件第3行之后插入内容 # 读取原目标文件的全部分行内容 original_file_lines = File.readlines(target_file_path) # 读取待插入文件的全部文本内容 insert_content = File.read(insert_file_path) # 拼接三部分内容:原文件前n行 + 待插入内容 + 原文件n行之后的所有内容 final_content = [ original_file_lines.take(insert_pos_after_line).join, insert_content, original_file_lines.drop(insert_pos_after_line).join ].join("") # 将拼接完成的内容写回原目标文件 File.write(target_file_path, final_content)
代码逻辑说明
- 不需要手动分步执行裁剪、暂存、追加的操作,通过
take方法取前n行、drop方法取n行之后的剩余内容,一步完成内容拆分 - 全量内容在内存中拼接完成后再一次性写入文件,不存在中途裁剪文件导致内容丢失的风险
内容的提问来源于stack exchange,提问作者Levon
相关产品推荐
相关产品推荐

