所以我在Ruby上几乎是一个n00b,并且我已经整理了一个代码来解决MinCut问题(对于一个赋值,是的 - 我已经整理并测试的那部分代码),我无法弄清楚如何读取文件并将其放入数组数组中。我有一个要读取的文本文件,其长度如下所示
1 37 79 164
2 123 134
3 48 123 134 109
我想把它读成一个二维数组,每一行和每一行都是分开的,每一行都进入一个数组。因此,上面示例的结果数组将是:
[[1, 37, 79, 164], [2, 123, 134], [3, 48, 123, 134, 109]]
我的阅读文本文件的代码如下:
def read_array(file, count)
int_array = []
File.foreach(file) do |f|
counter = 0
while (l = f.gets and counter < count ) do
temp_array = []
temp_array << l.to_i.split(" ")
int_array << temp_array
counter = counter + 1
end
end
return int_array
end
非常感谢任何帮助!
另外,如果它有帮助,我当前得到的错误是“在read_array中阻塞”:私有方法'被'调用#“
我已经尝试了一些事情,并且已经收到了不同的错误信息......
答案 0 :(得分:23)
File.readlines('test.txt').map do |line|
line.split.map(&:to_i)
end
<强>解释强>
readlines
读取整个文件并按换行符拆分。它看起来像这样:
["1 37 79 164\n", "2 123 134\n", "3 48 123 134 109"]
现在我们遍历这些行(使用map
)并将每一行拆分为其数字部分(split
)
[["1", "37", "79", "164"], ["2", "123", "134"], ["3", "48", "123", "134", "109"]]
这些项目仍然是字符串,因此内部map
会将它们转换为整数(to_i
)。
[[1, 37, 79, 164], [2, 123, 134], [3, 48, 123, 134, 109]]
答案 1 :(得分:11)
Ruby只为你提供了几行:
<强> tmp.txt 强>
1 2 3
10 20 30 45
4 2
Ruby代码
a = []
File.open('tmp.txt') do |f|
f.lines.each do |line|
a << line.split.map(&:to_i)
end
end
puts a.inspect
# => [[1, 2, 3], [10, 20, 30, 45], [4, 2]]
答案 2 :(得分:2)
代码中出现错误的原因是您在对象gets
上调用方法f
,这是String
,而不是File
,如您所料(检查the documentation for IO#foreach
以获取更多信息。)
我建议您用更简单,更Rubyish的方式重写代码,而不是修复代码,我会这样写:
def read_array(file_path)
File.foreach(file_path).with_object([]) do |line, result|
result << line.split.map(&:to_i)
end
end
鉴于此file.txt
:
1 37 79 164
2 123 134
3 48 123 134 109
它产生这个输出:
read_array('file.txt')
# => [[1, 37, 79, 164], [2, 123, 134], [3, 48, 123, 134, 109]]
答案 3 :(得分:1)
array_line = []
if File.exist? 'test.txt'
File.foreach( 'test.txt' ) do |line|
array_line.push line
end
end
答案 4 :(得分:0)
def read_array(file)
int_array = []
File.open(file, "r").each_line { |line| int_array << line.split(' ').map {|c| c.to_i} }
int_array
end