加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读