我需要创建一个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
答案 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"]