1

我有一个保存在数组中的人员列表,我想与组织循环一个文件以查找匹配项并保存它们,但它一直出错。我想我对数组做错了。

这正是我正在做的事情:

  1. 我在一个名为“personen_fixed.csv”的文件中有一个人员列表。
  2. 我将该列表保存到一个数组中。
  3. 我有另一个文件,它也有人名(“pers2”),还有其他三个有趣的数据列。我将四列保存到数组中。
  4. 我想遍历第一个数组(人员)并搜索与人员列表(“pers2”)的匹配项。
  5. 如果有匹配项,我想保存该行。

我现在得到的是两行数据,其中一行是所有人。请参阅下面的代码。在底部我有一些示例输入数据。

require 'csv'
array_pers1 = []
array_pers2 = []
array_orgaan = []
array_functie = []
array_rol = []

filename_1 = 'personen_fixed.csv'
CSV.foreach(filename_1, :col_sep => ";", :encoding => "windows-1251:utf-8", :return_headers => false) do |row|
  array_pers1 << row[0].to_s
end

filename_2 = 'Functies_fixed.csv'
CSV.foreach(filename_2, :col_sep => ";", :encoding => "windows-1251:utf-8", :return_headers => false) do |row|
  array_pers2 << row[1].to_s
  array_orgaan << row[16].to_s
  array_functie << row[17].to_s
  array_rol << row[18].to_s
end


CSV.open("testrij.csv", "w") do |row|
  row << ["rijnummer","link","ptext","soort_woonhuis"]

  for rij in array_pers1

    for x in 1...4426 do
      if rij === array_pers2["#{x}".to_f]
      pers2 = array_pers2["#{x}".to_f]
      orgaan = array_orgaan["#{x}".to_f]
      functie = array_functie["#{x}".to_f]
      rol = array_rol["#{x}".to_f]
      row << [pers2,orgaan,functie,rol]
      else 
      pers2 = ""
      orgaan = ""
      functie = ""
      rol = ""
      end
    end
  end
end

第一个excel数据的输入数据(excel列名和第一行数据):

person
someonesname

第二个excel文件的输入数据:

person,organizationid,role,organization,function
someonesname,34971,member,americanairways,boardofdirectors

由于数据集中的许多人在不同的组织有多个工作,我想把他们都保存在彼此旁边(我想要的输出):

person,organization(1),function(1),role(1),organization(2),function(2),role(2) (max 5)
4

1 回答 1

0

我不明白将 Functies csv 文件中的单行存储在 4 个单独的数组中,然后稍后将它们组合在一起的目的,所以我的回答并没有告诉你为什么你的方法不起作用。相反,我建议另一种我认为更清洁的方法。

从第一个文件构建一个名称数组是可以的。对于第二个文件,我会将每一行存储为一个数组并使用哈希:

data = {
   "name1 => ["name1", "orgaan1", "functie1", "rol1"],
   "name2 => ["name2", "orgaan2", "functie2", "rol2"],
   ...
}

构建它可能看起来像

data = {}
CSV.foreach(filename_2, :col_sep => ";", :encoding => "windows-1251:utf-8", :return_headers => false) do |row|
   name = row[1]
   orgaan = row[16]
   functie = row[17]
   rol = row[18]
   data[name] = [name, orgaan, functie, rol]
end  

然后你会遍历你的第一个数组并保留所有匹配的数组

results = []
for name in array_pers1
  results << data[name] if data.include?(name)
end

另一方面,如果您不想使用哈希并坚持使用数组(可能是因为名称不是唯一的),我仍然会像这样存储它们

data = [
   ["name1", "orgaan1", "functie1", "rol1"],
   ["name2", "orgaan2", "functie2", "rol2"]
]

然后在你的搜索步骤中,你会像这样迭代

results = []
for name in array_pers1
   for row in data
      results << row if row[0] == name
   end
end
于 2013-11-12T19:47:55.807 回答