2017-07-19 78 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中,否則你在做什麼看起來很好。