5

所以我几乎是 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

任何帮助是极大的赞赏!

另外,如果有帮助,我目前遇到的错误是“block in read_array”:私有方法 'gets' called for # ”

我已经尝试了一些事情,但得到了不同的错误消息......

4

5 回答 5

24
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]]
于 2013-07-26T14:31:48.643 回答
11

Ruby 只用了几行代码就为您提供了帮助:

tmp.txt

1 2 3
10 20 30 45
4 2

红宝石代码

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]]
于 2013-07-26T14:27:20.750 回答
2

发生代码中的错误是因为您正在调用getsobject 上的方法f,这是 a String,而不是File您期望的 a (有关更多信息,请查看文档IO#foreach)。

与其修复你的代码,我建议你用一种更简单、更 Ruby 风格的方式重写它,我会这样写:

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]] 
于 2013-07-26T14:32:35.170 回答
1
array_line = []  

if File.exist? 'test.txt'
  File.foreach( 'test.txt' ) do |line|
      array_line.push line
  end
end
于 2016-03-26T07:05:14.003 回答
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
于 2013-07-26T14:27:22.033 回答