我正在开发一个项目,该项目有两个独立的输入文件,每个文件都有一些与另一个文件相关的信息。
我将它们分别加载到各自的数组中,然后解析它们
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和category匹配时,我都需要有一个如下所示的记录:
supplier_ID地区类别制造商模型。
我最初的想法是迭代其中一个数组并使用#{contract_id} |#{region} |#{category} |#{manufacturer}作为KEY和#{model}将所有内容放入哈希作为价值。 但是限制在于它仅在阵列上迭代一次,因此输出限于相应阵列中的元素数量。
答案 0 :(得分:1)
我对你的问题的理解:
文件1的列包含contract_id,region,category,supplier_id。
文件2的列包含contract_id,region,category,manufacturer,model
您希望将文件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中自己执行。