Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 是否删除文本文件中的特定行?_Ruby_File_Line - Fatal编程技术网

Ruby 是否删除文本文件中的特定行?

Ruby 是否删除文本文件中的特定行?,ruby,file,line,Ruby,File,Line,如何从文本文件中删除单个特定行?例如,第三行或任何其他行。我试过这个: line = 2 file = File.open(filename, 'r+') file.each { last_line = file.pos unless file.eof? } file.seek(last_line, IO::SEEK_SET) file.close 不幸的是,它什么也没做。我尝试了很多其他的解决方案,但都不管用。我认为,由于文件系统的限制,您无法安全地做到这一点 file.each do |l

如何从文本文件中删除单个特定行?例如,第三行或任何其他行。我试过这个:

line = 2
file = File.open(filename, 'r+')
file.each { last_line = file.pos unless file.eof? }
file.seek(last_line, IO::SEEK_SET)
file.close

不幸的是,它什么也没做。我尝试了很多其他的解决方案,但都不管用。

我认为,由于文件系统的限制,您无法安全地做到这一点

file.each do |line|
  if should_be_deleted(line)
    f.seek(-line.length, IO::SEEK_CUR)
    f.write(' ' * (line.length - 1))
    f.write("\n")
  end
end
file.close

File.new(filename).each {|line| p line }
如果你真的想做一个就地编辑,你可以试着把它写入内存,编辑它,然后替换旧文件。但要注意,这种方法至少有两个问题。首先,如果你的程序在重写过程中停止,你将得到一个不完整的文件。第二,如果你的文件太大,它会消耗你的内存

file_lines = ''

IO.readlines(your_file).each do |line|
  file_lines += line unless <put here your condition for removing the line>
end

<extra string manipulation to file_lines if you wanted>

File.open(your_file, 'w') do |file|
  file.puts file_lines
end
文件行=“”
IO.readlines(您的|文件)。每个do |行|
文件行+=行,除非
结束
打开(你的_文件,'w')do|文件|
file.put文件行
结束
这样做应该是可行的,但使用临时文件是一种更安全、更标准的方法

require 'fileutils'

File.open(output_file, "w") do |out_file|
  File.foreach(input_file) do |line|
    out_file.puts line unless <put here your condition for removing the line>
  end
end

FileUtils.mv(output_file, input_file)
需要“fileutils”
打开(输出文件,“w”)do | out |文件|
foreach(输入文件)do |行|
out_file.put行,除非
结束
结束
mv(输出文件、输入文件)

您的条件可能是任何显示它是不需要的行的内容,例如,
file\u lines+=line,除非line.chomp==“aaab”
将删除行“aaab”。

我不理解您的解决方案,您能解释一下吗?您所说的“inplace”是什么意思吗?您可以修改现有文件(这是就地更新)或者创建一个新的。最后一种方法通常是首选的,因为它是非破坏性的。例如,检查
sed
是否带有选项
-i
。感谢您的解释。我想知道如何进行就地更新。那太棒了。你能给我一个就地更新的例子吗?我搜索了sed,但什么也没找到。我很感激你的工作,杜达,但你的解决方案都不管用。它给了我一个错误“…未定义的方法‘line’to‘u remove?’作为main:Object…”,因为“?”。你能告诉我为什么吗?对不起,请把线移开?应该是搬迁的条件,我会根据情况更新答案谢谢!你的解决方案真的帮助了我!再次感谢!没问题,伙计。我很高兴能帮上忙!