Ruby File在最后一个空行后没有读取内容\ n

时间:2012-05-24 05:19:23

标签: ruby gets

我正在尝试编写一个非常简单的ruby脚本来打开一个文本文件,从行的末尾删除\ n,除非该行以非字母字符开头,或者该行本身为空(\ n)。

下面的代码运行正常,只是它会跳过最后一行以外的所有内容。当我将\ n \ n添加到文件的末尾时,它完美地运行。示例:包含此文本的文件效果很好,并将所有内容拉到一行:

Hello
there my
friend how are you?

变为Hello there my friend how are you?

但是这样的文字:

Hello

there

my friend
how
are you today

仅返回HelloThere,并完全跳过最后3行。如果我在末尾添加2个空行,它将拾取所有内容并按照我的意愿行事。

有人可以向我解释为什么会这样吗?显然我知道我可以通过在开始时将\n\n附加到源文件的末尾来修复此实例,但这无助于我理解为什么.gets无效,因为我期望

提前感谢您的帮助!

source_file_name = "somefile.txt"
destination_file_name = "some_other_file.txt"
source_file = File.new(source_file_name, "r")

para = []
x = ""
while (line = source_file.gets)
  if line != "\n"
    if line[0].match(/[A-z]/)   #If the first character is a letter
        x += line.chomp + " "
    else
      x += "\n" + line.chomp + " "
    end
  else
    para[para.length] = x
    x = ""
  end
end

source_file.close

fixed_file = File.open(destination_file_name, "w")
para.each do |paragraph|
  fixed_file << "#{paragraph}\n\n"
end
fixed_file.close

3 个答案:

答案 0 :(得分:2)

您的问题在于,当且仅当您遇到空行('\ n')时,才将字符串x添加到para数组中。由于您的第二个示例在末尾不包含空行,因此x的最终内容永远不会添加到para数组中。

在不更改任何代码的情况下解决此问题的简便方法是在关闭while循环后添加以下行:

if(x != "")
    para.push(x)
end

我宁愿立即将字符串添加到我的数组中,而不是将它们附加到x上,直到你找到一个空行,但这应该适用于你的解决方案。

另外,

para.push(x)
para << x

阅读得更好,看起来比

更直接
para[para.length] = x

那个人把我扔了一秒钟,因为在非动态语言中,这会给你一个错误。我建议使用其中之一,因为它更具可读性。

答案 1 :(得分:1)

你的代码对我来说就像一个c代码, ruby​​ way 应该是这个代替你的100行。

File.write "dest.txt", File.read("src.txt")

答案 2 :(得分:1)

使用多行正则表达式更容易。也许:

source_file.read.gsub(/(?<!\n)\n([a-z])/im, ' \\1')