C'è uno strumento Ruby che mi consenta di caricare un file di abbreviazioni nel formato di (Abbreviato => Abr)? Quindi ho bisogno di leggere ogni parola da un altro file. Se la parola corrisponde alla parola nelle abbreviazioni, ho bisogno di cambiarla con la parola abbreviata. Penso di poter usare Hash ma non so come caricarlo da un file.Ruby: come caricare un hash da un file?
risposta
YAML è un formato molto universale per la memorizzazione dei dati in un modo che può essere trasferito tra app e linguaggi di programmazione. JSON è un'altra alternativa, molto comune nei siti web.
Io uso YAML per cose come i file di configurazione perché è molto facile leggere e modificare. Per esempio, tale struttura Rubino:
irb(main):002:0> foo = { 'a' => 1, 'b' => [2, 3], 'c' => { 'd' => 4, 'e' => 5 } }
{
"a" => 1,
"b" => [
[0] 2,
[1] 3
],
"c" => {
"d" => 4,
"e" => 5
}
}
Sembra che questa volta convertito in YAML:
irb(main):003:0> puts foo.to_yaml
---
a: 1
b:
- 2
- 3
c:
d: 4
e: 5
si potrebbe risparmiare che a un file:
File.open('foo.yaml', 'w') { |fo| fo.puts foo.to_yaml }
e leggere di nuovo in:
bar = YAML.load_file('foo.yaml')
{
"a" => 1,
"b" => [
[0] 2,
[1] 3
],
"c" => {
"d" => 4,
"e" => 5
}
}
Simile y, utilizzando JSON:
puts foo.to_json
{"a":1,"b":[2,3],"c":{"d":4,"e":5}}
È possibile salvare la JSON in un file, come si farebbe con YAML e ricaricarlo e trasformarlo di nuovo nel hash. Si tratta di una sintassi diversa po 'però:
irb(main):011:0> File.open('foo.json', 'w') { |fo| fo.puts foo.to_json }
nil
irb(main):012:0> bar = JSON.parse(File.read('foo.json'))
{
"a" => 1,
"b" => [
[0] 2,
[1] 3
],
"c" => {
"d" => 4,
"e" => 5
}
}
La grande vittoria o con qualsiasi linguaggio è in grado di leggere YAML o JSON in grado di leggere i file e utilizzare i dati, sia la lettura o la scrittura.
Eseguire la sostituzione delle stringhe è molto semplice una volta che si dispone di un hash, poiché lo String gsub
di Ruby String comprende gli hash. Questo è da the docs:
Se il secondo argomento è un hash, e il testo corrispondente è uno dei suoi tasti, il valore corrispondente è la stringa di sostituzione.
Questo significa che si può fare qualcosa di simile:
foo = 'Jackdaws love my giant sphinx of quartz'
bar = { 'quartz' => 'rosy quartz', 'sphinx' => 'panda' }
foo.gsub(Regexp.union(bar.keys), bar)
"Jackdaws love my giant panda of rosy quartz"
Tu devi guardare fuori per le collisioni di parole-confine facendo la sostituzione, ma la bandiera \b
in un modello può essere di aiuto. Fare quel lavoro è un esercizio per il lettore.
Vedere Marshal.load
e Marshal.dump
.
Inoltre, è possibile eseguire la serializzazione dell'hash in un file yaml e quindi leggerlo/salvarlo nuovamente tramite YAML.
Il formato 'Marshal' è (o può essere) specifico della versione di Ruby in uso e non esiste un modo (sensato) per leggere i dati di' Marshal' quando le versioni non corrispondono. Questo lo rende un cattivo formato per la serializzazione su disco. –
Ho trovato questo http://www.rubydoc.info/gems/bosh-director/1.1868.0/Bosh%2FDirector%2FConfig.load_hash dopo aver cercato come caricare gli hash da solo.
il mio esempio è quando si tratta di MongoDB in un'app Rails.
Così ho impostato un metodo di inizializzazione per ottenere la collezione con cui lavorerò.
def initialize @collection = self.class.collection end
self.class qui è la classe ci sto. Cerchiamo di usare le persone come esempio.
il metodo di carico è la seguente
def load_collection(file_path)
hash_values = self.class.load_hash(file_path)
@collection.insert_many(hash)
end
all'interno di un binding.pry
[1] pry(#<People>)> file_path
=> "people_results.json"
[2] pry(#<People>)> hash
=> [{"number"=>0, "first_name"=>"SHAUN", "last_name"=>"JOHNSON", "gender"=>"M", "group"=>"15 to 19", "secs"=>1464}, {"number"=>1, "first_name"=>"TUAN", "last_name"=>"JOHNSON", "gender"=>"M", "group"=>"masters", "secs"=>3994}, {"number"=>2, "first_name"=>"EARLINE", "last_name"=>"BROWN", "gender"=>"F", "group"=>"masters", "secs"=>1415}...
[3] pry(#<People>)> self
=> #<People:0x007fc80301b5f8 @coll=#<Mongo::Collection:0x70248510355560 namespace=test.people>>
[4] pry(#<People>)> self.class
=> People
Quindi, in questo caso il metodo load_hash
prende un parametro, e in questo caso i passata in un json file con alcuni dati in. Quindi inserisco i dati nella mia raccolta.
Anche se questa è una bella spiegazione, direi che introdurre yaml o json complica solo un semplice esercizio. Il file esiste già ed è già abbastanza semplice: un file di testo delimitato, un record per riga. Basta leggere il file per riga, dividerlo e creare l'hash. – Jim
Grazie! Funziona perfettamente ora. – user1128637