2014-07-24 4 views
1

J'ai utilisé SmarterCSV pour convertir le fichier en format lit en fichier csv et en changeant les noms des colonnes.Comment utiliser Ruby pour combiner plusieurs fichiers CSV dans un gros fichier CSV?

Maintenant j'ai rassemblé plusieurs fichiers CSV, et je veux les combiner en un gros fichier CSV.

En test3.csv, il y a trois colonnes, chromosome, start_site et end_site qui seront utilisés, et les trois autres colonnes, binding_site_pattern, score et strand qui seront supprimés.

En ajoutant trois nouvelles colonnes dans le fichier test3.csv, les données sont les mêmes dans la colonne transcription_factor: Cmyc, dans la colonne cell_type: PWM, dans la colonne project_name: JASPAR.

Quelqu'un a des idées sur celui-ci?

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,- 

résultat combiné désiré:

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 

Répondre

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

merci, ça aide vraiment, au fait, que signifie *? – Michael

+0

@ user3239006, c'est l'opérateur ["splat"] (http://endofline.wordpress.com/2011/01/21/the-strange-ruby-splat/), qui fait des choses dans les tableaux. Il est utilisé ici pour "décompresser" le tableau 'hs' en un certain nombre d'arguments séparés pour' values_at'. –

+0

J'ai compris. Merci. – Michael

Questions connexes