2014-07-24 41 views
1

我一直在使用SmarterCSV將bed格式文件轉換爲csv文件並更改列名稱。如何使用Ruby將多個CSV文件合併爲一個大的CSV文件?

現在我已經收集了幾個CSV文件,並且希望將它們合併爲一個大的CSV文件。

在test3.csv,有三列,chromosomestart_siteend_site將被使用,而其他三個列,binding_site_patternscorestrand該將被移除。

通過增加三個新列到test3.csv文件時,數據都在transcription_factor列都一樣:Cmyc,在cell_type列:PWM,在project_name列:JASPAR

任何人對此有任何意見?

test1.csv

transcription_factor,cell_type,chromosome,start_site,end_site,project_name 
Cmyc,GM12878,11,809296,809827,ENCODE 
Cmyc,GM12878,11,6704236,6704683,ENCODE 

test2.csv

transcription_factor,cell_type,chromosome,start_site,end_site,project_name 
Cmyc,H1ESC,19,9710417,9710587,ENCODE 
Cmyc,H1ESC,11,541754,542137,ENCODE 

test3.csv

chromosome,start_site,end_site,binding_site_pattern,score,strand 
chr1,21942,21953,AAGCACGTGGT,1752,+  
chr1,21943,21954,AACCACGTGCT,1335,- 

希望的組合的結果:

transcription_factor,cell_type,chromosome,start_site,end_site,project_name 
Cmyc,GM12878,11,809296,809827,ENCODE 
Cmyc,GM12878,11,6704236,6704683,ENCODE 
Cmyc,H1ESC,19,9710417,9710587,ENCODE  
Cmyc,H1ESC,11,541754,542137,ENCODE 
Cmyc,PWM,1,21942,21953,JASPAR 
Cmyc,PWM,1,21943,21954,JASPAR 

回答

3
hs = %w{ transcription_factor cell_type chromosome start_site end_site project_name } 

CSV.open('result.csv','w') do |csv| 
    csv << hs 
    CSV.foreach('test1.csv', headers: true) {|row| csv << row.values_at(*hs) } 
    CSV.foreach('test2.csv', headers: true) {|row| csv << row.values_at(*hs) } 
    CSV.foreach('test3.csv', headers: true) do |row| 
    csv << ['Cmyc', 'PWM', row['chromosome'].match(/\d+/).to_s] + row.values_at('start_site', 'end_site') + ['JASPAR'] 
    end 
end 
+0

感謝它真的有幫助,順便說一句,*的意思是什麼? – Michael

+0

@ user3239006,它是所謂的[「splat」操作符](http://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat/),它對數組執行操作。它在這裏用來將'hs'數組「解包」爲'values_at'的多個單獨參數。 –

+0

明白了。謝謝。 – Michael