Ruby:如何将从文件读取的行拆分为二维数组?

时间:2014-06-18 15:27:45

标签: ruby arrays io

对于一件小事,我想将一些信息存储在一个文件中并以这种方式从中读取,我最后会有一个二维数组。

假设这是配置文件的内容:

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

它有效,但肯定有更好的方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:5)

您可以使用IO::readlinesString#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>