Ruby存储查询数据

时间:2018-03-13 21:10:18

标签: ruby performance parsing lookup

我有一个字符串

"4813243948,1234433948,1.3,Type2
 1234433948,4813243948,1.3,Type1
 1234433948,6345635414,1.3,Type1
 4813243948,2435677524,1.3,Type2
 4813243948,5245654367,1.3,Type2
 2345243524,6754846756,1.3,Type1
 1234512345,2345124354,1.3,Type1
 1342534332,4565346546,1.3,Type1"

这是电话外拨电话数据,其中每个新线路代表一个新的电话呼叫。 (来电,来电,持续时间,线路类型) 我想以一种允许我查询特定数字并获得数字,类型,使用的总分钟数以及它所做的所有呼叫(出站呼叫)的字符串输出的方式保存这些数据。我只想在一个ruby文件中执行此操作。

因此输入此

4813243948

返回

4813243948, Type 2, 3.9 Minutes total
 1234433948, 1.3
 2435677524, 1.3
 5245654367, 1.3

我想知道我是否应该尝试将值存储在数组中,或创建自定义类并使每个数字成为类的对象,然后将调用追加到每个数字..不知道如何进行类方法。为每个数字设置一个不同的数组似乎会变得混乱,因为有数千个数字和数百万个调用。当然,提供的输入字符串是真实来源的一小部分。

2 个答案:

答案 0 :(得分:2)

如果您只想查询呼叫来源的号码,您可以将数据存储在散列中,其中键是“来自”号码,值是一个数组,或另一个散列,其中包含其余的的数据。例如:

{ '4813243948': { call_to: 1234433948, duration: 1.3, line_type: 'Type2' }, ... }

如果数据集非常大,或者您需要更复杂的查询,最好将其存储在数据库中并直接查询。

答案 1 :(得分:2)

  

我有一个字符串   str = "4813243948,1234433948,1.3,Type2 1234433948,4813243948,1.3,Type1" require 'csv' calls = CSV.parse(str, headers: %w[from to length type], header_converters: :symbol).map(&:to_h) # => [{:from=>"4813243948", :to=>"1234433948", :length=>"1.3", :type=>"Type2"}, # {:from=>"1234433948", :to=>"4813243948", :length=>"1.3", :type=>"Type1"}]

这看起来像一个CSV。如果你在顶部拍了一些标题,你可以将它解析成一个哈希数组。

calls.select{ |c| c[:from] == '4813243948' }

这与原始字符串基本相同,只是为了便于访问而交易一些内存。你现在可以"查询"这个数据集是这样的:

yum install

然后根据您的意愿汇总进行演示。

当然,搜索此数组需要线性时间,因此如果您有数百万个调用,您可能希望将它们组织在更有效的搜索结构(如B树)中,或将整个数据集移动到真实数据库中。 / p>