Ruby 存储查询数据
Ruby storing data for queries
我有一个字符串
"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"
这是电话phone 出站呼叫数据,其中每条新线代表一个新的 phone 呼叫。
(呼叫自、呼叫至、持续时间、线路类型)
我想以一种允许我查询特定号码并获取该号码、其类型、使用的总分钟数以及它发出的所有呼叫(出站呼叫)的字符串输出的方式保存此数据。我只想在单个 ruby 文件中执行此操作。
因此输入此
4813243948
Returns
4813243948, Type 2, 3.9 Minutes total
1234433948, 1.3
2435677524, 1.3
5245654367, 1.3
我想知道我是否应该尝试将值存储在数组中,或者创建一个自定义 class 并使每个数字成为 class 的对象,然后将调用附加到每个数字.. 不确定如何执行 class 方法。每个号码都有不同的数组似乎会变得混乱,因为有数千个号码和数百万个电话。当然,提供的输入字符串只是真正来源的一小部分。
如果您只想查询呼叫发起的号码,您可以将数据存储在散列中,其中键是 "call from" 号码,值是数组或另一个散列,包含其余数据。例如:
{ '4813243948': { call_to: 1234433948, duration: 1.3, line_type: 'Type2' }, ... }
如果数据集非常大,或者需要更复杂的查询,最好将其存储在数据库中,直接查询即可。
I have a string
"4813243948,1234433948,1.3,Type2
1234433948,4813243948,1.3,Type1
这看起来像 CSV。如果你在上面打一些headers,你可以把它解析成一个哈希数组。
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"}]
这与您的原始字符串基本相同,只是为了便于访问而牺牲了一些内存。您现在可以 "query" 这样的数据集:
calls.select{ |c| c[:from] == '4813243948' }
然后根据您的需要汇总进行演示。
自然地,搜索此数组需要线性时间,因此如果您有数百万次调用,您可能希望以更高效的搜索结构(如 B-Tree)组织它们或将整个数据集移动到真实数据库。
我有一个字符串
"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"
这是电话phone 出站呼叫数据,其中每条新线代表一个新的 phone 呼叫。 (呼叫自、呼叫至、持续时间、线路类型) 我想以一种允许我查询特定号码并获取该号码、其类型、使用的总分钟数以及它发出的所有呼叫(出站呼叫)的字符串输出的方式保存此数据。我只想在单个 ruby 文件中执行此操作。
因此输入此
4813243948
Returns
4813243948, Type 2, 3.9 Minutes total
1234433948, 1.3
2435677524, 1.3
5245654367, 1.3
我想知道我是否应该尝试将值存储在数组中,或者创建一个自定义 class 并使每个数字成为 class 的对象,然后将调用附加到每个数字.. 不确定如何执行 class 方法。每个号码都有不同的数组似乎会变得混乱,因为有数千个号码和数百万个电话。当然,提供的输入字符串只是真正来源的一小部分。
如果您只想查询呼叫发起的号码,您可以将数据存储在散列中,其中键是 "call from" 号码,值是数组或另一个散列,包含其余数据。例如:
{ '4813243948': { call_to: 1234433948, duration: 1.3, line_type: 'Type2' }, ... }
如果数据集非常大,或者需要更复杂的查询,最好将其存储在数据库中,直接查询即可。
I have a string
"4813243948,1234433948,1.3,Type2 1234433948,4813243948,1.3,Type1
这看起来像 CSV。如果你在上面打一些headers,你可以把它解析成一个哈希数组。
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"}]
这与您的原始字符串基本相同,只是为了便于访问而牺牲了一些内存。您现在可以 "query" 这样的数据集:
calls.select{ |c| c[:from] == '4813243948' }
然后根据您的需要汇总进行演示。
自然地,搜索此数组需要线性时间,因此如果您有数百万次调用,您可能希望以更高效的搜索结构(如 B-Tree)组织它们或将整个数据集移动到真实数据库。