【问题标题】:Conditional array or hash combining条件数组或哈希组合
【发布时间】:2014-09-24 16:59:25
【问题描述】:

我正在开发一个项目,该项目有 2 个单独的输入文件,每个文件都有一些与另一个文件相关的信息。

在像这样解析它们之后,我已将它们分别加载到自己的数组中

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

文件 1 有 30,000 行,文件 2 有 400,000 行。根据我的估计,我想要的输出将有大约 600,000 行。

现在我的问题是找到一种组合它们的方法,因为它们具有多对多的关系。 每次contract_id、region AND category 匹配时,我都需要一个如下所示的记录:

supplier_ID 地区类别制造商型号。

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

【问题讨论】:

  • 我不明白这个问题。
  • 当您可以将值添加为数组时,为什么还要编写这个丑陋的管道分隔字符串?

标签: ruby arrays hash


【解决方案1】:

我对你的问题的理解:

文件 1 包含 contract_id、region、category、supplier_id 列。

文件 2 包含 contract_id、region、category、manufacturer、model 列

您希望将文件 1 和文件 2 作为输入的程序执行相当于 SQL 连接的操作,以生成具有以下列的新文件:供应商 ID、区域、类别、制造商、型号。你的加入条件是contract_id、region、category需要匹配。

我将如何解决这个问题:

第 1 步: 将两个文件读入包含每个文件的数据的数组中。不要将数据条目存储为难看的管道分隔字符串;将它们存储为数组或哈希。

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

第 2 步: 遍历两个文件中的数据并生成哈希值,以便按您关心的列(contract_id、区域和类别)对它们进行索引。例如,要索引文件 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 中自己进行。

【讨论】:

  • 我想你已经完全理解了我的问题。如果我遇到困难,我将开始研究并更新我的问题。谢谢!
  • 您的回答正是我需要的帮助。我昨天能够让一切正常工作,并想说声谢谢!
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 2017-06-19
  • 2015-11-08
  • 1970-01-01
  • 2018-12-11
  • 2016-06-01
相关资源
最近更新 更多