2013-05-12 4 views
0

У меня есть некоторые файлы:Объединить несколько строк текста элементов рубина

file1.txt 

[some] "one" 

[like] "two" 

file2.txt 

[some] "test" 

[like] "info" 

, и так далее.

мне нужно объединить их равными [] -элементов в каждом файле:

file_output.txt 

[some] "one" "test" 

[like] "two" "info" 

Как я могу сделать это с помощью Ruby?

+0

Работа над решением, которое не использует регулярное выражение теперь, если вы все еще нужен один – Senjai

ответ

0
File.write('file_output.txt', 
    %w{file1.txt file2.txt}. 
    flat_map { |f| File.readlines(f) }. 
    map(&:strip).reject(&:empty?). 
    map { |l| l.split(' ',2) }. 
    group_by(&:first). 
    map { |k,v| [k, *v.map(&:last)].join(' ') << "\n" }. 
    join("\n") 
) 
+0

он отлично работает, спасибо. – coldmind

0
["file1.txt", "file2.txt"] 
.inject({}) do |h, f| 
    File.read(f).scan(/^(\[.+?\])\s+(.*)/).each do |k, v| 
    (h[k] ||= k).concat(" #{v}") 
    end; h 
end.values 
.tap{|a| File.write("file_output.txt", a.join($/*2))} 
+1

'открытый (п, &: читать)' кажется, как неловко сказать 'File.read (е) '. В Ruby 2 вы можете просто использовать ['File :: write'] (http://www.ruby-doc.org/core-2.0/IO.html#method-c-write) вместо' open (.. .) {| f | f.write} ' – dbenhur

+0

Спасибо за информацию. – sawa

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