2017-07-19 43 views
0

我试图构建一种扫描程序,它通过导出的数据库进行爬网并创建有关找到多少某些项目的统计信息。导出文件的结构是这样的:扫描类似INI的大文件

^ 
property1: value1 
property2: value4 
^ 
property1: value5 
property2: value7 
^ 
property3: value2 
property1: value6 

在这个例子中,我想在多少集就知道确实property1有值5?

^是一个字节序列,标记新数据集的开始。问题在于属性有时不在一个数据集中,或者属性内的顺序不同。

目前,我正在浏览每个数据集并遍历每一行,并检查该行是否以想要的属性开头,但我觉得它可以做得更漂亮并且更高效。

public static Order getNextOrder(StreamReader sr){ 
      String myLine = ""; 
      String prop1 = ""; 


      while(!myLine.StartsWith("^") && myLine!=null){ 
       myLine = sr.ReadLine(); 
       if(myLine.StartsWith("prop1")){ 
        prop1 = myLine.Split(':')[1].Trim(); 
        continue; 
       } 

      } 
      if(myLine==null) 
       isFinished = true; 

      var order = new Order(prop1); 
      if(OrderFilter.accepted(order)) 
       return order; 
      return null; 
     } 
+0

你能展示你目前在做什么吗?你有*特定的问题*? – gravity

+0

具体问题:是否有更高性能和/或干净的解决方案? – Curunir

+0

您尚未显示您的解决方案实际*是*。你讨论它,并展示了示例数据,但不是你如何迭代数据以提供任何见解。 – gravity

回答

1

只要文件很小并且您想询问的文件问题数量有限,您所做的事情看起来相当不错。

基本上将文件解析为结构化数据,然后查询数据。在你的情况下,逐行读取文件并将它们放入Order对象中,这些对象可能会进入数组中,并且可以对其进行一些分析。更复杂的解决方案只是这个主题的变体。

例如,您可以将数据流输出到一个擅长此类数据分析的数据库中,例如Elastic Search。然后,您可以对数据执行各种有趣的查询,而无需编写除流式解析器之外的任何代码。

如果您的文件变得如此之大以至于无法在合理的时间内处理它,或者一次性将其全部加载到内存中,或者您需要让非程序员能够对数据执行任意查询,那么你可能需要把它放到ES中,否则你在做什么看起来很好。