Ruby如何合并两个具有略微不同标头的CSV文件
发布时间:2020-12-17 03:24:00 所属栏目:百科 来源:网络整理
导读:我有两个带有一些常用标题的CSV文件,其他只出现在一个或另一个中的文件,例如: # csv_1.csvH1,H2,H3V11,V22,V33V14,V25,V35 # csv_2.csvH1,H4V1a,V4bV1c,V4d 我想合并两者并获得一个新的CSV文件,该文件结合了以前CSV文件的所有信息.在需要时注入新列,并使用
我有两个带有一些常用标题的CSV文件,其他只出现在一个或另一个中的文件,例如:
# csv_1.csv H1,H2,H3 V11,V22,V33 V14,V25,V35 # csv_2.csv H1,H4 V1a,V4b V1c,V4d 我想合并两者并获得一个新的CSV文件,该文件结合了以前CSV文件的所有信息.在需要时注入新列,并使用空值提供新单元格. 结果示例: H1,H3,H4 V11,V33,V14,V35,V1a,V4d 解决方法
接受挑战 :)
#!/usr/bin/env ruby require "csv" module MergeCsv class << self def run(csv_paths) csv_files = csv_paths.map { |p| CSV.read(p,headers: true) } merge(csv_files) end private def merge(csv_files) headers = csv_files.flat_map(&:headers).uniq.sort hash_array = csv_files.flat_map(&method(:csv_to_hash_array)) CSV.generate do |merged_csv| merged_csv << headers hash_array.each do |row| merged_csv << row.values_at(*headers) end end end # Probably not the most performant way,but easy def csv_to_hash_array(csv) csv.to_a[1..-1].map { |row| csv.headers.zip(row).to_h } end end end if(ARGV.length == 0) puts "Use: ruby merge_csv.rb <file_path_csv_1> <file_path_csv_2>" exit 1 end puts MergeCsv.run(ARGV) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- iphone – 使用OCMock 1.77进行iOS4和Xcode 4 /
- react-redux 开发实践与学习分享
- ruby – 为什么BigDecimal返回一个奇怪的值?
- Ruby 添加按钮和标签 (TkButton,TkLabel)
- BeyondCompare3 提示许可证密钥已被撤销解决方法
- 【Android基础】内容提供者ContentProvider的使用
- c# – 如何获取WPF listview以将字节数组格式化为
- 打开xcode会不断添加旧证书
- oracle-sqldeveloper – SQL Developer多表视图
- flash – 当有例如crossdomain.xml和clientacces
热点阅读