2010-09-22 7 views
1

je le texte suivant qui sera toujours le même format:parsing en utilisant Ruby

1 
"13" 
"241" 
"Rabun" 
"06" 
"County" 

2 
"13" 
"281" 
"Towns" 
"06" 
"County" 

je voudrais attribuer à chaque section à un hachage comme:

locality= {:id => "", :fips1 => "", :fips2 => "", :county => "", :stateid => "", :type => ""} 

Comment pourrais-je aller à propos de faire cela dans Ruby? Toute aide est grandement appréciée.

Répondre

1
fields = [:fips1,:fips2,:county,:stateid,:type] 
arraywithhashes = yourtextdata.split("\n\n").map { |loc| 
    Hash[ 
     [[:id,loc[/\d+/]]] + 
     fields.zip(loc.scan(/"([^"]+)"/).map &:first) 
    ] 
} 

Si vous ajoutez de nouveaux champs à votre dossier, le seul que vous devrez modifier est pour l'ajouter à fields.

+1

Je voudrais savoir Ruby – willcodejavaforfood

+1

@willcodejavaforfood: Alors apprendre! Après un certain temps, vous préféreriez mourir de faim que de code Java ... –

+0

Les données proviennent d'un fichier texte, donc si je le fais textfile = Fichier.open ("filename.dat") arraywithhashes = textfile.split (" \ n \ n "). map {| loc | Je reçois un NoMethodError. – Mike

0

Pour chaque section, utilisez une expression régulière avec des groupes correspondant à chaque entrée de la section, puis créez simplement une table de hachage comme vous l'avez décrit à partir de ces groupes.

0
locality.each_key { |k| locality.store(k, "foo") } 

Une autre personne novice, mais qui pourrait être un début pour vous.

0

Vous pourriez envisager d'utiliser un Struct au lieu d'un Hash.

Locality = Struct.new(:id, :fips1, :fips2, :county, :stateid, :type) 
localities = [] 
DATA.each_slice(7) do |chunk| 
    chunk.pop if chunk.size == 7 
    localities << Locality.new(*chunk.map{|line| line.scan(/\w+/) }) 
end 

p localities # => [#<struct Locality id=["1"], fips1=["13"], fips2=["241"], etc. 
puts localities[1].fips2 # => 281 

__END__ 
1 
"13" 
"241" 
"Rabun" 
"06" 
"County" 

2 
"13" 
"281" 
"Towns" 
"06" 
"County" 
  • each_slice (7) prend 7 lignes de DATA (la substance après __END__).

  • La dernière ligne est supprimée à moins que soit seulement six lignes (le dernier enregistrement ).

  • Une copie nettoyée des lignes restantes est effectuée. Avec ces valeurs, une nouvelle localité est créée et ajoutée à un tableau