合并具有不同数据Ruby的两个CSV

时间:2018-04-15 04:39:44

标签: ruby csv

我需要创建一个CSV文件,其中包含已从当前系统导出的两个不同CSV的数据。我熟悉在ruby中创建,阅读和编​​写CSV文件,但这个文件让我感到难过。

google.csv

ffffff

asm.csv

Email_address,First_name,Last_name
samling@duneland.k12.in.us,Suzanne,Amling

我需要使用来自 google.csv 的电子邮件替换 asm.csv 中的电子邮件,这些电子邮件对应于正确的名字和姓氏。我不确定如何匹配两个csvs中的名字和姓氏来替换它们并创建一个新名称。我怎样才能做到这一点?

我已经尝试过来自SO的答案,但它只返回名字和姓氏。

first_name,last_name,email_address
SUZANNE,AMLING,SUZANNE.AMLING@DUNELAND.K12.IN.US

1 个答案:

答案 0 :(得分:0)

我们先创建两个CSV文件。

asm=<<_
Email_address,First_name,Last_name
avance@duneland.k12.in.us,Abigail,Vance
astafford@duneland.k12.in.us,Adrienne,Stafford
AFath@duneland.k12.in.us,Alysha,Fath
_

google=<<_
first_name,middle_name,last_name,email_address
ALBERT,,EINSTEIN,al@princeton.edu
ADRIENNE,X,STAFFORD,adrienne@yahoo.com
ALYSHA,M,FATH,afath@noodle.com
ABIGAIL,R,VANCE,abby@gmail.com
_

ASM_FNAME="asm.csv"
GOOGLE_FNAME="google.csv"

File.write(ASM_FNAME, asm)
  #=> 159
File.write(GOOGLE_FNAME, google)
  #=> 182

阅读GOOGLE_FNAME并创建哈希。

require 'csv'

h = CSV.foreach(GOOGLE_FNAME, headers:true).with_object({}) do |line,h|
  h[[line['first_name'].downcase, line['last_name'].downcase]] = line['email_address']
end
  #=> {["albert", "einstein"]=>"al@princeton.edu",
  #    ["adrienne", "stafford"]=>"adrienne@yahoo.com",
  #    ["alysha", "fath"]=>"afath@noodle.com",
  #    ["abigail", "vance"]=>"abby@gmail.com"}

现在阅读ASM_FNAME并使用哈希h替换电子邮件地址。

CSV.foreach(ASM_FNAME, headers:true).map do |line|
  [h[[line['First_name'].downcase, line['Last_name'].downcase ]],
    line['First_name'], line['Last_name']].join(',')
end
  #=> ["abby@gmail.com,Abigail,Vance",
  #    "adrienne@yahoo.com,Adrienne,Stafford",
  #    "afath@noodle.com,Alysha,Fath"]