2008-11-20 71 views
3

本質上,我必須將一個平面文件放入數據庫中。平面文件與每行上的前兩個字符一起表示它是哪種類型的記錄。適用於平面文件處理的數據結構?

我是否爲屬性與記錄中的字段匹配的每個記錄類型創建一個類?我應該只使用數組嗎?

我想在將數據保存到數據庫中之前將數據加載到某種數據結構中,以便我可以使用單元測試來驗證數據是否已正確加載。

這裏是我有什麼用(BAI2銀行對賬單)工作樣本:

01,121000358,CLIENT,050312,0213,1,80,1,2/ 

02,CLIENT-STANDARD,BOFAGB22,1,050311,2359,,/ 

03,600812345678,GBP,fab1,111319005,,V,050314,0000/ 

88,fab2,113781251,,V,050315,0000,fab3,113781251,,V,050316,0000/ 

88,fab4,113781251,,V,050317,0000,fab5,113781251,,V,050318,0000/ 

88,010,0,,,015,0,,,045,0,,,100,302982205,,,400,302982205,,/ 

16,169,57626223,V,050311,0000,102 0101857345,/ 

88,LLOYDS TSB BANK PL 779300 99129797 

88,TRF/REF 6008ABS12300015439 

88,102 0101857345 K BANK GIRO CREDIT 

88,/IVD-11 MAR 

49,1778372829,90/ 

98,1778372839,1,91/ 

99,1778372839,1,92 

回答

1

我建議創建類(或結構,或者是什麼有史以來值鍵入您的語言支持),爲

record.ClientReference 

record[0] 

這麼多的描述,如果您使用的是(太棒了!)FileHelpers Library,那麼你的條款對你來說就差不多了。

+0

有趣。我查看了FileHelpers庫,但它不支持連續記錄(在我的示例中爲88條記錄)。 – Jim 2008-11-20 15:43:06

+0

你在用什麼語言? – Svante 2008-11-21 02:27:31

1

驗證邏輯通常至少有2個級別,更高級別爲「格式良好」,更精細級別爲「正確數據」。

這裏有幾個單獨的問題。一個問題是簡單地驗證數據,或者編寫測試以確保解析是準確的。一個簡單的方法是解析一個接受給定值範圍的類,如果不是,則拋出相應的錯誤,例如 。

公共無效setField1(int i)以 { 如果(I> 100)拋出新InvalidDataException ... }

每個記錄類型創建不同的類別是你可能想,如果解析邏輯做一些事情對於不同的代碼顯着不同,所以您沒有像

public void setField2(String s) 
    { 
     if (field1==88 && s.equals ... 

     else if (field2==22 && s 
    } 

yechh。

0

當我不得不在過去加載這類數據時,我已將它們全部放入工作表中,其中一個字段中的前兩個字符和另一個字段中的前兩個字符。然後,我根據前兩個字符分析出適當的其他工作表。然後,在將第二組工作表中的數據插入數據庫之前,我已經完成了任何清理和驗證。

在SQL Server中,您可以通過DTS(2000)或SSIS軟件包並使用SSIS執行此操作,您可能能夠在工作表中首先存儲工作表中的數據,但該工具是相似的,請使用前兩個字符確定要使用的數據流分支,然後將其餘的記錄解析爲某種類型的保存機制,然後在插入之前清理並驗證。我相信其他數據庫也有一些類型的導入數據的機制,並且會使用一個simliar進程。

0

我同意,如果您的數據格式有任何形式的複雜性,你應該創建一組自定義類的來解析和保存數據,執行驗證,並做其他任何適當的模式任務(例如,返回一個人類可讀的描述,雖然有些人會認爲這樣會更好地把它放到一個單獨的視圖類中)。這可能是一個很好的情況,使用繼承,你有一個父類(可能是抽象的)定義所有類型的記錄通用的屬性和方法,每個子類可以覆蓋這些方法來提供他們自己的解析和驗證,如果有必要,或者添加自己的屬性和方法。

0

爲每種類型的行創建一個類將是比使用數組更好的解決方案。

但是,這就是說,在過去我已經使用哈希表的Arraylists來完成同樣的事情。 arraylist中的每個項目都是一行,散列表中的每個條目都是表示列名和單元格值的鍵/值對。

0

爲什麼不從設計數據庫開始,它將保存數據,然後您可以使用實體框架爲您生成類。

0

這裏有一個古怪的想法:

如果你在Perl的工作,你可以使用DBD::CSV從您的平面文件讀取數據,只要你給它正確的價值觀爲分離器和EOL字符。然後您可以通過SQL語句從平面文件中讀取行; DBI會爲你製作標準的Perl數據結構,並且你可以運行你喜歡的任何驗證邏輯。一旦每行通過所有驗證測試,您就可以使用DBD :: whatever將其寫入目標數據庫。

-steve