2014-07-24 39 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