读取制表符分隔文件并使用attr_reader分离数组文件的策略

时间:2010-10-24 20:05:37

标签: ruby

尝试获取一个简单的test.txt文件,并在读入后将文本和整数分开以进行数组操作。我们的想法是能够使用/要求来自单独的Person类的attr_accessor。 所以我可以使用:name,:hair_color,:gender

例如,让我们说我们的文本文件中有一个由制表符分隔符分隔的,为简洁起见,我只使用了空格:

Bob red_hair 38
Joe brown_hair 39
John black_hair 40

我的课程会读到:

 class Person
    attr_accessor :name, :hair_color, :gender


   def initialize
    @place_holder = 'test'
   end

   def to_s
    @test_string = 'test a string'
   end
 end

我的主要档案是我目前遇到的战略问题:

 test_my_array = File.readlines('test.txt').each('\t')  #having trouble with 

我很确定逐行操作比使用一个文件更容易。我不确定那之后去哪儿。我知道我需要将我的数据分类为:name,:hair_color,:gender。抛出一些代码,这样我就可以尝试了。

1 个答案:

答案 0 :(得分:2)

如果您使initialize方法接受namehair_colorgender的值,则可以这样做:

my_array = File.readlines('test.txt').map do |line|
  Person.new( *line.split("\t") )
end

如果您无法修改initialize方法,则需要逐个调用编写器方法:

my_array = File.readlines('test.txt').map do |line|
  name, hair_color, gender = line.split("\t")
  person = Person.new
  person.name = name
  person.hair_color = hair_color
  person.gender = gender
  person
end

使初始化的最简单方法是接受属性作为参数,而不必自己设置所有变量,是使用Struct,这会将整个代码缩短为:

Person = Struct.new(:name, :hair_color, :gender)
my_array = File.readlines('test.txt').map do |line|
  Person.new( *line.split("\t") )
end
#=> [ #<struct Person name="Bob", hair_color="red_hair", gender="male\n">,
#     #<struct Person name="Joe", hair_color="brown_hair", gender="male\n">,
#     #<struct Person name="John", hair_color="black_hair", gender="male\n">,
#     #<struct Person name="\n", hair_color=nil, gender=nil>]