使用数组迭代和解析其他数组CSV?

时间:2013-11-12 18:47:27

标签: ruby arrays loops csv

我有一个保存在数组中的人员列表,我想与寻找匹配的组织循环一个文件并保存它们但是它一直出错。我想我的数组有问题。

这正是我正在做的事情:

  1. 我有一个名为'personen_fixed.csv'的文件中的人员列表。
  2. 我将该列表保存到数组中。
  3. 我有另一个文件也有人名(“pers2”),还有另外三个有趣的数据列。我将四列保存到数组中。
  4. 我想遍历第一个数组(人员)并搜索与人员列表匹配的匹配项(“pers2”)。
  5. 如果匹配,我想保存该行。
  6. 我现在得到的是两行数据,其中一行充满了所有人。请参阅下面的代码。在底部我有一些示例输入数据。

    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)
    

1 个答案:

答案 0 :(得分: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