Ruby存储查询数据

问题描述 投票:1回答:2

我有一个字符串

"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

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

ruby performance parsing lookup
2个回答
2
投票

我有一个字符串 "4813243948,1234433948,1.3,Type2 1234433948,4813243948,1.3,Type1

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

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"}]

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

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

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

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


2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.