ruby-on-rails Rails +读取没有固定头和键值对的XLSX或CSV

rpppsulh  于 2023-05-30  发布在  Ruby
关注(0)|答案(1)|浏览(92)

在Rails中尝试读取没有固定头的XLSX / CSV文件。
举个例子
第一个CSV文件,头将像user_id,email,dob
第二个CSV文件,头将像user_id,用户名,电子邮件
因此系统应该设法正确地读取它们,并创建适当的JSON,如
对于第一个文件,JSON将类似于

{
  "user_id": 1,
  "email": "example@eample.com",
  "dob": "2001-01-01",
}

对于第二个文件,JSON将类似于

{
  "user_id": 1,
  "email": "example@eample.com",
  "username": "example"
}
11dmarpk

11dmarpk1#

你可以这样做:

require 'csv'

file1 = <<CSV1
user_id,email,dob
1,bob@bob.com,1998/12/1
2,alice@alice.com,2001/1/2
CSV1

file2 = <<CSV2
user_id,email,name
1,bob@bob.com,bob
2,alice@alice.com,alice
CSV2

# make an array of the rows as hashes,
# e.g. [ {"user_id"=>"1", "email"=>"bob@bob.com", "dob"=>"1998/12/1"},
#        {"user_id"=>"2", "email"=>"alice@alice.com", "dob"=>"2001/1/2"} ]
def csv_to_array(csv_string)
  CSV.parse(csv_string, headers: true).map(&:to_h)
end

a1 = csv_to_array(file1)
a2 = csv_to_array(file2)

# now zip the two arrays, then merge each
puts a1.zip(a2).map{|a| a[0].merge(a[1])}.inspect
# => [{"user_id"=>"1", "email"=>"bob@bob.com", "dob"=>"1998/12/1", "name"=>"bob"},
#     {"user_id"=>"2", "email"=>"alice@alice.com", "dob"=>"2001/1/2", "name"=>"alice"}]

相关问题