代码之家  ›  专栏  ›  技术社区  ›  Lyres

Ruby存储查询数据

  •  1
  • Lyres  · 技术社区  · 7 年前

    我有一根绳子

    "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 回复  |  直到 7 年前
        1
  •  2
  •   Sergio Tulentsev    7 年前

    我有一根绳子 "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
  •  2
  •   Roma149    7 年前

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

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

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