我使用ruby读取文件并使用.split分割行。
example.txt中
1
2
3
line1,line2,line3= @line.to_s.split("\n",3)
#actual
line1 => ["1
line2 => ", "2
line3 => ", "3"]
#what I expect
line1=1
line2=2
line3=3
我怎样才能得到我的预期?
编辑:这只是一个新行,因为我无法在我的问题中输入1个新行。更具体一点:
example.txt中
first_line \ nsecond_line \ nthird_line
File.open('Example.txt', 'r') do |f1|
@line = f1.readlines
f1.close
end
line1,line2,line3= @line.to_s.split("\n",3)
#actual
line1 => ["first_line
line2 => ", "second_line
line3 => ", "third_line"]
#what I expect
line1=first_line
line2=second_line
line3=third_line
答案 0 :(得分:4)
如果您尝试使用行结尾,则无法使用'\n'
进行拆分。您必须使用"\n"
。
使用'\n'
的字符串不会将\n
解释为行结尾,而是将其视为字面反斜杠,后跟" n":
'\n' # => "\\n"
"\n" # => "\n"
问题根本没有明确,输入文件示例也没有给出显示的小示例代码,但是,猜测你想要的结果......
如果输入的文件名为' example.txt'看起来像:
1 2 3
您可以通过多种方式阅读:
File.read('example.txt').split("\n")
# => ["1", "2", "3"]
或者:
File.readlines('example.txt').map(&:chomp)
# => ["1", "2", "3"]
然而,无论是哪种工作,在将文件读入内存时都会设置非常糟糕的优先级。它被称为" slurping"并且如果文件大于可用内存,则可能会使代码崩溃或将其运行,以及运行它的计算机进行爬网。并且,即使它适合内存,将大文件加载到内存中也会导致暂停,因为内存已分配并重新分配。所以,不要这样做。
相反,逐行阅读文件并尽可能以这种方式处理:
File.foreach('example.txt') do |line|
puts line
end
# >> 1
# >> 2
# >> 3
不要这样做:
File.open('Example.txt', 'r') do |f1|
@line = f1.readlines
f1.close
end
Ruby会自动关闭这样打开的文件:
File.open('Example.txt', 'r') do |f1|
...
end
无需在块内使用close
。
答案 1 :(得分:0)
取决于您期望的具体内容(以及@line
是什么)。如果您正在寻找数字,可以使用:
line1, line2, line3 = @line.to_s.scan(/\d/)
如果您想要其他角色,可以使用其他正则表达式。