2009-04-30 90 views
0

我有這個導出文件的一些奇怪的(這個行業的標準!)格式,我需要導入到我們的數據庫 。該文件基本上是這樣的:以奇怪的格式導入文本文件在C#

DATRKAKT-START 
    KAKT_LKZ "D" 
    KAKT_DAT_STAMM "1042665" 

    DATRKAIB-START 
    KAIB_AZ "18831025" 
    KAIB_STATUS_FM 2 
    KAIB_KZ_WAE "E" 
    DATRKAIB-END 

    DATRKARP-START 
    KARP_MELD "831025" 
    KARP_ST_MELD "G" 
    DATRKARP-END 

... 
DATRKAKT-END 

有一個總的1963年不同行56節,所以我真的不進 創建56個教學班,1963年的屬性...你會如何處理這個文件 這樣你可以訪問一些屬性,就像它是一個對象?

Datrkaib.Kaib_Status_Fm 
Datrkarp.karp_St_Meld 

回答

1

除非您的編程語言允許您在運行時向類添加方法,或讓類對未定義方法的調用作出響應,否則您無法執行此操作。問題是,即使C#確實讓你這樣做了,你仍然會失去類型安全和智能感知幫助(大概是想讓它像這樣工作的原因之一),那麼爲什麼不直接將它讀入一些數據結構呢?我傾向於是可包含值或其他哈希散列,所以你會得到這樣的方法調用(VB):

Datrkakt("Lkz") 
Datrkakt("Dat_Stam") 
Datrkakt("Kaib")("Az") 
Datrkakt("Kaib")("Status_Fm") 

或者,如果你知道所有的數據項被統一命名爲您的示例中,只使用一個哈希:

Datr("Kakt_Lkz") 
Datr("Kakt_Dat_Stam") 
Datr("Kaib_Az") 
Datr("Kaib_Status_Fm") 

您可以通過創建所有的數據項名稱的枚舉和獲取找回智能感知幫助:

Datr(DatrItem.KAKT_LKZ) 
Datr(DatrIrem.KAIB_STATUS_FM) 
0

我會去與不同對象的列表<name, list>,這可以是一個元組<name, value>或對象的命名列表。

1

它看起來像結構化數據 - 我會運行搜索和替換,並將其轉換爲簡單的XML。然後導入。

如果你想生成一個代碼文件 - 考慮codesmith - 我認爲它可以做到這一點。

+0

我的傾向是完全相反的。數據已經結構良好。爲什麼要進行轉換? – 2009-04-30 10:36:16

+1

因爲搜索和替換比編寫該格式的解析器簡單得多,因爲在.NET中,您可以免費獲得XML讀取,轉換和序列化。 – OregonGhost 2009-04-30 10:49:50

0

沒有那會自動爲你做這個。我會創建一個包含所有適當屬性(比如DatrDocument)的類,並創建一個DatrReader類(類似於XmlDocument/XmlReader類的想法)。

DatrReader將需要讀取文件或流的內容,並將其解析爲DatrDocument。

您可能還想編寫一個DatrWriter類,它將採用DatrDocument並將其寫入流中。