条件数组或哈希组合



我正在处理一个项目,该项目有两个独立的输入文件,每个文件都有一些与另一个文件相关的信息。

在像一样解析它们之后,我已经将它们各自加载到了自己的数组中

file_1 << "#{contract_id}|#{region}|#{category}|#{supplier_ID}"
file_2 << "#{contract_id}|#{region}|#{category}|#{manufacturer}|#{model}"

文件1有30000行,文件2有400000行。根据我的估计,我想要的输出将在60万行左右。

现在我的问题是想办法把它们结合起来,因为它们有很多对很多的关系。每次contract_id,region AND category匹配时,我都需要有一个如下所示的记录:

supplier_ID地区类别制造商型号。

我最初的想法是对其中一个数组进行迭代,并使用#{contract_id}|#{region}|#{category}|#{manufacturer}作为KEY和#{model}作为值,将所有内容放入哈希中。但其局限性在于,它只在数组上迭代一次,因此输出仅限于相应数组中的元素数量。

我对你的问题的理解:

文件1具有contract_id、region、category和supplier_id列。

文件2的列为contract_id、地区、类别、制造商、型号

您希望一个将文件1和文件2作为输入的程序执行相当于SQL联接的操作,以生成具有以下列的新文件:supplier_id、region、category、manufacturer、model。您的联接条件是contract_id、region和category需要匹配。

以下是我将如何解决这个问题:

步骤1:将两个文件读取到数组中,每个数组都有数据。不要将数据项存储为难看的管道分隔字符串;将它们存储为数组或散列。

file_1_entries << [contract_id, region, category, supplier_ID]

第2步:对两个文件中的数据进行迭代,并进行散列,以便根据您关心的列(contract_id、region和category)对它们进行索引。例如,要为文件1编制索引,您需要生成一个散列,其键是这三列(数组或字符串)的某种组合,值是文件1中匹配的条目的数组。

file_1_index = {}
file_1_entries.each do |x|
  key = some_function_of(x)
  file_1_index[key] ||= []
  file_1_index[key] << x
end

第3步:遍历一个索引哈希,并使用索引哈希执行您想要执行的联接。

file_1_index.keys.each do |key|
  file_1_matching_entries = file_1_index.fetch(key, [])
  file_2_matching_entries = file_2_index.fetch(key, [])
  # nested loop to do the join
end

我不能详细介绍每一个步骤,因为你问了一个非常广泛的问题,需要很长时间才能添加所有细节。但如果你陷入困境,你应该试着做这些步骤,并提出更具体的问题。

在执行此操作时,您的计算机可能会耗尽内存,具体取决于您的计算机。在这种情况下,您可能需要构建一个临时数据库(例如使用sqlite),然后使用实际的SQL查询执行联接,而不是尝试在Ruby中自己执行。

最新更新