簡體   English   中英

具有2個分隔符和不同記錄類型的C#自定義文件解析

[英]C# custom file parsing with 2 delimiters and different record types

我有一個(不是很有效)CSV文件,其中包含多種類型的行。 任何記錄可能是大約6種不同類型之一,並且每種類型都有不同數量的屬性。 任何行的第一部分都包含時間戳記和記錄類型,后跟數據的標准CSV。

1456057920 PERSON, Ted Danson, 123 Fake Street, 555-123-3214, blah
1476195120 PLACE, Detroit, Michigan, 12345
1440581532 THING, Bucket, Has holes, Not a good bucket

為了使事情更復雜,我需要能夠根據某些條件對記錄進行不同的處理。 因此,可以將PERSON類型自動插入到DB中,而無需用戶輸入,但是THING類型將顯示在屏幕上,供用戶檢查和批准,然后再添加到DB中並繼續進行解析等。

通常,我會使用CsvHelper之類的庫將記錄映射到類型,但是在這種情況下,由於類型可能不同,並且第一部分使用空格而不是逗號,因此我不知道如何使用標准CSV來做到這一點。圖書館。 所以目前我每個循環的操作方式是:

  1. 根據逗號分割字符串。
  2. 用空格分割第一個數組項。
  3. 使用switch語句確定類型並創建對象。
  4. 將該對象放入類型對象的列表。
  5. 現在我要去哪里弄糊塗了,因為我現在有各種類型的清單,將不得不使用另一個開關或是否要確定下一個零件。

我不確定我是否真的需要該List,但是我感覺用戶會希望能夠手動瀏覽文件中的記錄。

至此,這已經開始制作很長的,令人困惑的代碼,而我的直覺告訴我,必須有一種更清潔的方法來執行此操作。 我以為使用Type.GetType(string)可能會簡化一些代碼,但這似乎在10k +條記錄的循環中可能效率極低,並且可能使事情更加混亂。 然后,我認為也許創建一些接口可能會有所幫助,但是我並不是最擅長在這種情況下使用接口,而且我似乎最終會遇到同樣的情況。

那么解析此文件的一種更易管理的方法是什么? 是否有任何C#解析庫都可以處理類似的事情?

您可以實現具有Timestamp屬性和Process方法(也可能還有其他方法)的IRecord接口。 然后,為每種記錄類型實現具體類型。

  1. 使用switch語句確定類型,並創建並填充正確的具體類型。

  2. 將每個對象放在列表中

之后,您可以做任何您需要的事情。 一些例子:

遍歷每個項目並調用Process()進行處理。

使用linq .OfType<{concrete type}>分割列表。 (警告1萬條記錄會很慢,因為它將遍歷每種具體類型的整個列表。)

使用重寫的ToString方法給出IRecord的單個文本表示IRecord

如果使用WPF,則可以為每種具體類型定義一個數據類型模板,將ItemsControl派生綁定到IRecord的集合,並且您的“詳細信息”顯示(例如ListItem或單獨的ContentControl )將使用正確的DataTemplate自動顯示該項目

繼續我的評論-取決於。 您所描述的內容實際上對於初學者來說非常不錯,您當然可以將其擴展為一系列針對每種對象類型的工廠-這樣您就可以從顯式開關切換到搜索可以解析行的第一個工廠。 如果您將來打算添加更多的對象類型,可能會證明很有用-您只需添加另一個工廠即可用於新的對象。 這些對象應共享一個公共接口,由您自己決定。 接口通常用於定義行為,因此似乎並非如此。 也許您應該寧願只是字典? 您需要問自己是否真的需要強類型對象? 也許您需要的是一個簡單的類,該類具有ObjectType屬性和Dictionary屬性,並帶有一些用於輕松鍵入屬性訪問的幫助方法,例如GetBool,GetInt或通用Get?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM