Ruby 删除前两行并向文件中添加两行

Ruby 删除前两行并向文件中添加两行,ruby,file,read-write,Ruby,File,Read Write,我有一个以以下内容开头的文本文件: Title aaa bbb ccc 我不知道这一行将包括什么,但我知道文件的结构将是Title,然后是空行,然后是实际的行。我想将其修改为: New Title fff aaa bbb ccc 我想: 但是writelines不存在 `writelines' for File:Class (NoMethodError) 有没有办法删除文件的前两行并添加三行新行?将put与整个数组一起使用: File.open("destinationFile", "

我有一个以以下内容开头的文本文件:

Title

aaa
bbb
ccc
我不知道这一行将包括什么,但我知道文件的结构将是
Title
,然后是空行,然后是实际的行。我想将其修改为:

New Title

fff
aaa
bbb
ccc
我想:

但是
writelines
不存在

`writelines' for File:Class (NoMethodError)

有没有办法删除文件的前两行并添加三行新行?

将put与整个数组一起使用:

File.open("destinationFile", "w+") do |f|
   f.puts(lineArray)
end

我会从以下内容开始:

NEWLINES = {
  0 => "New Title",
  1 => "\nfff"
}

File.open('test.txt.new', 'w') do |fo|
  File.foreach('test.txt').with_index do |li, ln|
    fo.puts (NEWLINES[ln] || li)
  end
end
以下是运行后的
test.txt.new
的内容:

New Title

fff
aaa
bbb
ccc
其思想是在
换行符
散列中提供替换行的列表。当从原始文件读取每一行时,将在哈希中检查行号,如果该行存在,则使用相应的值,否则使用原始行

如果要读取整个文件,然后替换,则会稍微减少代码,但代码会有可伸缩性问题:

NEWLINES = [
  "New Title",
  "",
  "fff"
]

file = File.readlines('test.txt')
File.open('test.txt.new', 'w') do |fo|
  fo.puts NEWLINES
  fo.puts file[(NEWLINES.size - 1) .. -1]
end
它不是很聪明,但它可以用于简单的替换


如果你真的想把它做好,学习如何工作,创建一个diff文件,然后让它完成繁重的工作,因为它是为这类任务设计的,运行速度非常快,每天在世界各地的*nix系统上被使用数百万次。

如果你的文件很大,将它们全部读入记忆的性能和记忆含义值得思考。如果这是一个问题,那么最好的办法是将文件作为流处理。我会这样做的

首先,定义替换文本:

require "stringio"

replacement = StringOI.new <<END
New Title

fff
END
最后,将原始文件中的剩余行写入新文件。这次我们将通过以下方式更有效地完成:

就这样。当然,手动关闭这些文件是一种拖拽(当我们这样做时,我们应该在
确保
块中进行),因此最好使用
文件的块形式。打开
自动关闭它们。此外,我们还可以将
orig.get
调用移动到
替换中。每行
循环:

File.open(dest_fn, 'wb') do |dest|
  File.open(orig_fn, 'r') do |orig|
    replacement.each_line {|ln| dest << ln; orig.gets }
    File.copy_stream(orig, dest)
  end
end
File.open(dest_fn,'wb')do|dest|
文件。打开(源代码,'r')do |源代码|

replacement.each_行{| ln | dest首先创建一个输入测试文件

FNameIn = "test_in"

text = <<_
Title

How now,
brown cow?
_
  #=> "Title\n\nHow now,\nbrown cow?\n" 

File.write(FNameIn, text)
  #=> 27
检查结果:

puts File.read(FNameOut)
  # New Title
  #
  # fff
  # How now,
  # brown cow?
Ruby将在其块终止时关闭这两个文件中的每一个

如果文件不大,您可以改为写入:

File.write(FNameOut,
  ["New Title\n", "\n", "fff\n"].concat(File.readlines(FNameIn).drop(2)).join)

您已链接到Facets gem的文档。如果您想使用
File.writelines
,您必须安装该gem。@Jordan在ruby中有没有内置的方法可以在没有第三方gem的情况下完成此操作?附言。您问题的标题是“前两行”,但看起来您确实想替换前三行(空行仍然是一行)。FWIW,替换数组中前三项的更简单方法是
lineArr[0..2]=[“新标题”、“\n”、“fff\n”]
单击“查看源代码”Facets文档底部的链接。这只是一个四行方法。在Ruby中就是这样做的。你的文件会有多大?它会增长吗?使用
readlines
或任何其他IO方法来压缩文件将是不可伸缩的。这会逐行写入文件吗?如果是的话,这对大文件来说不是一个坏做法吗?这应该是正确的我相信OP想要一种方法,删除文件的前2行,然后在开始处插入3行新行,而不读取整个文件,然后写出整个文件,我认为Ruby的
file
方法不可能做到这一点。那么为什么要这样做呢使用lineArray=File.readlines(destinationFile).drop(2)…@u.gen?请详细说明…非常确定OP对File.readlines(destinationFile).drop(2)的内容感到困惑
是的。我认为他认为这是删除文件的前两行并返回它们,这是错误的。这只是返回它们,而不是删除它们。关于
diff
的好观点。您可能想展示如何从Ruby内部实现这一点。我想到了这一点,但这是一个非常不同的问题。
File.open(dest_fn, 'wb') do |dest|
  File.open(orig_fn, 'r') do |orig|
    replacement.each_line {|ln| dest << ln; orig.gets }
    File.copy_stream(orig, dest)
  end
end
FNameIn = "test_in"

text = <<_
Title

How now,
brown cow?
_
  #=> "Title\n\nHow now,\nbrown cow?\n" 

File.write(FNameIn, text)
  #=> 27
FNameOut = "test_out"

File.open(FNameIn) do |fin|
  fin.gets; fin.gets  
  File.open(FNameOut, 'w') do |fout|
    fout.puts "New Title"
    fout.puts
    fout.puts "fff"
    until fin.eof?    
      fout.puts fin.gets
    end
  end
end
puts File.read(FNameOut)
  # New Title
  #
  # fff
  # How now,
  # brown cow?
File.write(FNameOut,
  ["New Title\n", "\n", "fff\n"].concat(File.readlines(FNameIn).drop(2)).join)