如何将文本文件读入数组数组(每个子数组是文本文件中的一行?)

时间:2013-07-26 14:21:32

标签: ruby arrays file split

所以我在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中阻塞”:私有方法'被'调用#“

我已经尝试了一些事情,并且已经收到了不同的错误信息......

5 个答案:

答案 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