对于一件小事,我想将一些信息存储在一个文件中并以这种方式从中读取,我最后会有一个二维数组。
假设这是配置文件的内容:
Banana:Yellow
Apple:Red
这是我提出的代码:
a = File.read("config.txt")
b = a.split("\n")
k = Array.new
b.each { |x| k.push(x.split(":"))}
print k
它有效,但肯定有更好的方法可以做到这一点吗?
答案 0 :(得分:5)
您可以使用IO::readlines
和String#splt
File.readlines("config.txt").map { |str| str.split(":") }
或者,使用CSV::read
require 'csv'
CSV.read("path/to/file", 'rb', :col_sep => ':')
# => [["Banana", "Yellow"], ["Apple", "Red"]]
使用CSV,您可以跳过行,您不想使用:skip_lines
选项进行处理:
当设置为响应匹配的对象时,与其匹配的每一行都被视为注释,并在解析期间被忽略。设置为String时,首先将其转换为Regexp。设置为nil时,不将任何行视为注释。如果传递的对象没有响应匹配,则抛出 ArgumentError 。
假设我有一个文件test.txt
,其内容为: -
Banana:Yellow
Apple:Reds
#foo:biz
bar:cz
现在我不想阅读以#
开头的行。然后我将重新编写代码
require 'csv'
CSV.read("#{__dir__}/test.txt", 'rb', :col_sep => ':',:skip_lines => /\A#/)
让我们运行代码,看看它的作用:
arup@linux-wzza:~/Ruby> ruby test.rb
[["Banana", "Yellow"], ["Apple", "Reds"], ["bar", "cz"]]
arup@linux-wzza:~/Ruby>