我正在尝试编写一个非常简单的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
仅返回Hello
和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
答案 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')