2010-10-24 8 views
1

Essayant de prendre un fichier test.txt simple et de séparer le texte et les entiers après leur lecture pour la manipulation du tableau. L'idée est de pouvoir utiliser/require l'attr_accessor de la classe Person distincte. Je peux donc utiliser: nom,: hair_color,: le sexeStratégie pour lire un fichier délimité par des tabulations et séparer le fichier pour array avec attr_reader

Par exemple laisse dit que nous avons dans notre fichier texte qui est tout séparé par le séparateur onglet, pour la brièveté, je viens d'utiliser l'espace:

Bob red_hair 38 
Joe brown_hair 39 
John black_hair 40 

ma classe lirait quelque chose comme:

class Person 
    attr_accessor :name, :hair_color, :gender 


    def initialize 
    @place_holder = 'test' 
    end 

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

mon fichier principal que je vais avoir des problèmes de stratégie avec jusqu'à présent:

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

Je suis sûr qu'il est plus facile de manipuler ligne par ligne plutôt que d'un fichier. Je ne suis pas sûr de savoir où aller après ça. Je sais que je dois séparer mes données d'une certaine façon pour: name,: hair_color,: gender. Lève du code pour que je puisse essayer les choses.

Répondre

2

Si vous faites votre méthode initialize accepter des valeurs pour name, hair_color et gender, vous pouvez le faire comme ceci:

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

Si vous ne pouvez pas modifier votre méthode initialize, vous aurez besoin d'appeler le méthodes d'auteur, un par un comme celui-ci:

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 

La meilleure façon de faire accepter initialize les attributs que l'argument sans avoir à mettre toutes les variables vous-même, est d'utiliser Struct, ce qui raccourcit l'intégralité de votre code à:

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>] 
+0

J'ai oublié .map, doh! Merci pour l'aide! – Matt

Questions connexes