2

我正在尝试编写一个非常简单的 ruby​​ 脚本,该脚本打开一个文本文件,从行尾删除 \n,除非该行以非字母字符开头或该行本身为空白 (\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

只返回Helloand There,并完全跳过最后 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
4

3 回答 3

2

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

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

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

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

还,

para.push(x)
para << x

两者都比阅读更好,看起来更直接

para[para.length] = x

那个让我愣了一秒,因为在非动态语言中,这会给你一个错误。我建议改用其中之一,只是因为它更具可读性。

于 2012-05-24T05:47:55.037 回答
1

你的代码对我来说就像 ac 代码,ruby 方式应该是这样,它代替了你上面的 100 行。

File.write "dest.txt", File.read("src.txt")
于 2012-05-24T05:52:39.367 回答
1

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

source_file.read.gsub(/(?<!\n)\n([a-z])/im, ' \\1')
于 2012-05-24T05:55:10.347 回答