2008-10-11 78 views
2

我在Excel文件(和csv文件)中有大量數據。數據需要放入數據庫(mysql)。但是,在進入數據庫之前,需要處理它。例如,如果列1小於列3,則將列4添加到列2.在信息持續存在之前,必須遵守相當多的規則。在數據庫之前處理數據的應用程序設計

什麼是一個好的設計來完成這項任務? (用java)

其他備註

流程需要被自動化。從某種意義上說,我不必手動進入和更改數據。我們正在談論數千行數據,每行有15列信息。

目前,我有一種責任設計鏈的設置。每個規則的一個類(Java)。當一個規則完成時,它會調用以下規則。

更多信息

通常有每​​個數據片約5000行。速度不是一個巨大的問題,因爲這個大的輸入不經常發生。

我已經考慮過流口水,但是我不確定這個任務對於流程來說足夠複雜。

實施例的規則:

  1. 所有貨幣(在特定列中的數據)不能包含貨幣符號。

  2. 類別名稱必須一致(如書案=書櫃)

  3. 入學日期不能是將來的日期

  4. 文本輸入只能包含[AZ 0-9 \ s]的

等。
此外,如果任何一列信息無效,則需要在 處理完成時報告 (或者可能停止處理)。

我目前的解決方案工作。不過,我認爲還有改進的空間,所以我正在尋找 的理想,以瞭解如何改進以及其他人如何處理類似 的情況。

我已經考慮過(非常簡單地)使用口水,但我不確定工作是否足夠複雜以利用流口水。

回答

1

如果我不在乎爲此在1個階段(奧利提到),我可能會使用一個pipe and filters設計。既然你的規則比較簡單,我可能會做幾個基於委託的類。例如(C#代碼,但Java的應該是相當類似的...也許有人可以翻譯?):

interface IFilter { 
    public IEnumerable<string> Filter(IEnumerable<string> file) { 
    } 
} 

class PredicateFilter : IFilter { 
    public PredicateFilter(Predicate<string> predicate) { } 

    public IEnumerable<string> Filter(IEnumerable<string> file) { 
     foreach (string s in file) { 
     if (this.Predicate(s)) { 
      yield return s; 
     } 
     } 
    } 
} 

class ActionFilter : IFilter { 
    public ActionFilter(Action<string> action) { } 

    public IEnumerable<string> Filter(IEnumerable<string> file) { 
     foreach (string s in file) { 
     this.Action(s); 
     yield return s; 
     } 
    } 
} 

class ReplaceFilter : IFilter { 
    public ReplaceFilter(Func<string, string> replace) { } 

    public IEnumerable<string> Filter(IEnumerable<string> file) { 
    foreach (string s in file) { 
     yield return this.Replace(s); 
    } 
    } 
} 

從那裏,你可以直接使用委託的過濾器,或繼承他們的具體細節。然後,將它們註冊到將通過每個過濾器的管道。

0

每個規則的類? 真的嗎?也許我不理解這些規則的數量和複雜性,但我會(半僞代碼):

public class ALine { 
    private int col1; 
    private int col2; 
    private int coln; 
    // ... 

    public ALine(string line) { 
     // read row into private variables 
     // ... 

     this.Process(); 
     this.Insert(); 
    } 

    public void Process() { 
     // do all your rules here working with the local variables 
    } 

    public void Insert() { 
     // write to DB 
    } 
} 

foreach line in csv 
    new ALine(line); 
0

您使用類爲每個規則聽起來確實有點重重量的方法,但它有隨着新規則的出現,易於修改和擴展的好處就會出現。

至於加載數據批量加載是要走的路。我已閱讀了一些信息,表明它可能比使用插入語句加載速度快3個數量級。你可以找到它的一些信息here

0

將數據批量加載到臨時表中,然後使用sql來應用您的規則。 使用臨時表作爲插入到真實表的基礎。 刪除臨時表。

1

我認爲你的方法是可以的。特別是如果你在每個處理器上使用相同的接口。

你也可以看看一些叫Drules的東西,目前是Jboss規則。我前一段時間用於我的應用程序的一個重要規則部分,我喜歡的是業務邏輯可以表達爲例如電子表格或DSL,然後將其編譯爲java(運行時,我認爲這是也是編譯時選項)。它使規則更加靈活,從而可讀。這也很容易學習(2天左右)。

這裏有一個鏈接到開源Jboss-rules。在jboss.com上,如果這更符合你公司的口味,你無疑可以購買一個官方維護的版本。

0

你可以看到所有不同的答案都來自他們自己的經驗和觀點。

由於我們不太瞭解系統中行的複雜性和數量,因此我們傾向於根據之前的工作提供建議。

如果您想縮小爲實施的1/2解決方案,請嘗試提供更多詳細信息。

好運

1

只需創建一個函數來執行每個規則,併爲每個值調用每個適用的函數。我不明白這是如何需要任何異國情調的建築。

0

它可能不是你想聽到的,它不是以任何方式「有趣的方式」,但有一個更簡單的方法來做到這一點。

只要您的數據逐行進行評估......您可以在您的Excel文件中設置另一個工作表並使用電子表格樣式函數來執行必要的轉換,從原始數據表引用數據。對於更復雜的函數,您可以使用嵌入在Excel中的vba寫出自定義操作。

我已經多次使用這種方法,它的工作非常好,它只是不太性感。

相關問題