2014-01-20 3 views
0

Нужно распечатать следующий хеш в txt-файлы с каждой клавишей в качестве имени файла и значений каждого ключа в качестве содержимого для каждого файла.Ruby - Печать хэша в txt-файл

хэш

{ 'a' => [ 'abc' , 'def', 'ghi'] , 'b' => [ 'jkl' , 'mno' , 'pqr' ] } 

Выходные файлы должны иметь следующий формат

a.txt

abc 
def 
ghi 

b.txt

jkl 
mno 
pqr 

Хотите знать, как идти об этом ?

+0

Вы также хотите создать файл? или файл уже созданы? –

+0

@ArupRakshit, да, это намерение создать файл динамически. – user3206440

+0

Посмотрите на документацию/учебники по Hash # каждому, File.open и File # puts. –

ответ

2
hash = { 'a' => [ 'abc' , 'def', 'ghi'] , 'b' => [ 'jkl' , 'mno' , 'pqr' ] } 
hash.each do |k,v| 
    File.open("#{k}.txt", 'w'){|f| f.puts v} 
end 
+0

это должно быть 'f.puts * v', [' IO :: puts'] (http://www.ruby-doc.org/core-2.1.0/IO.html#method--puts) принимает его аргументы в виде списка, разделенного запятой. –

+0

Не нужно «раскладывать» значение. 'puts' делает правильные вещи, когда видит массив. ["Если вызывается с аргументом массива, записывает каждый элемент в новую строку."] (Http://www.ruby-doc.org/core-2.1.0/IO.html#method--puts) –

+0

@ theTinMan Я пропустил линию .. Спасибо .. Действительно Рубин очень умный. –

1

Попробуйте что-то вроде:

hash.each do |key, vals| 
    File.open("#{key}.txt", 'w') { |file| file.puts *vals } 
end 
+0

Я думаю, что вы можете пропустить новую строку в ruby ​​1.9+ – PinnyM

+1

Просто сделайте 'file.puts (* vals)' –

+1

+1 to puts * vals - @PinnyM: спасибо! Я никогда не замечал. –

1
hash.each do |key,value| 

File.open("nameoffile.txt", "w"){ |file| file.puts value} #Opened file gets each value of correposnding hash key's 

end 

или просто

hash.each_value do |value| 

File.open("nameoffile.txt", "w"){ |file| file.puts value} #Opened file gets each value of correposnding hash key's 

end 
+0

Узнайте, как отформатировать свой ответ (или вопросы). В окне редактирования есть хорошая [страница справки] (http://stackoverflow.com/editing-help), в которой объясняется, как все это работает. –

2

Я бы использовать File.write:

hash = { 'a' => [ 'abc' , 'def', 'ghi'] , 'b' => [ 'jkl' , 'mno' , 'pqr' ] } 
hash.each { |k, v| File.write(k, v.join("\n")) } 

Или:

hash.each { |k, v| File.write(k, v * "\n") } 

Если вы хотите возврат каретки в конце последней строки, то один из ответов с помощью puts в цикле будет работать. Некоторые приложения заботятся о том, существует ли завершающая строка, а другие нет.

Смежные вопросы