2013-03-19 26 views
7

我正在研究一些集成了幾十個csv文件信息的C++代碼。它們都包含一些我想要提取的時間戳記錄數據,但是每個文件中的表示方式有所不同。表示之間的差異超出了不同的列順序和列名 - 例如,一個文件中的多列一行可能是不同文件中的多行。聚合異構表格數據的設計模式

因此,我需要對每個文件進行一些自定義處理,以便將所有文件中包含必要信息的統一數據結構放在一起。我的問題是,是否有首選的代碼模式來保持複雜性的可管理性和代碼的優雅性?或者,如果有一個很好的案例研究,我應該檢查一下過去是如何處理這種複雜性的。我認爲像perl這樣的腳本語言可能會更容易一些,但是現在這個項目是用C++編寫的,而且我的問題更多的是關於是否有代碼模式來處理這個問題 - 所以答案不會不必太具體語言。)

+0

您可能想要對您的數據進行某種查看... – ltjax 2013-03-19 15:25:41

+0

從根本上看,所有源數據大致相同,即使表示方式不同嗎?你知道在打開格式化的文件之前,還是必須先閱讀標題行? – 2013-03-19 16:14:40

+0

我知道apriori的格式,雖然沒有簡單的方法以編程方式從頭文件中推斷出結構(用於列命名和日期格式的約定是不同的,並且在某些情況下甚至行/列結構在文件之間也是不同的例如提到)。 – daj 2013-03-19 16:58:33

回答

3

在你的問題中有幾個短語用在我身上:custom handling for each filerepresentation is somewhat differentcomplexity manageable。基於你將不得不使用基於csv文件格式的各種不同的解析算法,並且你(從我所知道的)想鬆散地耦合你的解析機制,我會推薦strategy模式。

策略模式將使解析機制與CSV文件中包含的數據的用戶分離。數據的用戶對CSV文件的格式沒有興趣,他們只對該文件中的信息感興趣,這使得策略模式成爲一個很好的選擇。如果解析機制之間有相似之處,則可以同時使用template和策略模式以減少重複並利用繼承。

通過使用策略模式,那麼你可以提取策略創建到factory methodabstract factory您認爲合適的進一步允許客戶從解析方法來分離。

+0

對於戰略模式,根據運行時數據提前選擇行爲。它只適用於這裏,如果文件有一個頭來表明格式的指示,或者它們是完全不同的。這可能是一種可能性,因爲OP沒有提供有關格式的任何信息。提前選擇' – Thibaut 2013-03-20 13:01:34

+0

',這取決於運行時數據對我來說似乎是一個矛盾。但是,您的正確之處在於,您必須具有某種適用於特定CSV文件的策略。你可以隨時嘗試所有這些,看看哪一個可以工作,但這不是解決問題的理想方案。 – nattyddubbs 2013-03-20 13:16:41

+0

對不起;這不是很清楚。提前,我的意思是在應用之前。首先在運行時選擇一個策略,然後在選擇後才應用。如果您選擇了錯誤的策略,則沒有固有的回滾概念。這種模式只適用於在使用前有足夠的信息來選擇正確的策略。 – Thibaut 2013-03-20 13:31:20

0

我不太清楚你想用不同的文件做什麼。如果想法是像使用數據庫表一樣使用它們,並且您有一些鍵分散在多個文件中的附加信息,那麼您可能需要看一下MapReduce這樣的內容,首先從每個文件構建信息的一部分,然後聚合信息在第二步共享相同的密鑰。

至於數據結構,它取決於你的文件的佈局。我可能會爲每種文件類型設置一個專用閱讀器,這些閱讀器會將信息存儲在代表文件中信息的專用數據結構中。您可以爲每個信息附加一個密鑰,並使用reduce操作將所有信息片段使用同一個密鑰進行合併,並將它們聚合到代理結構中。另一方面,如果想法是從不同的序列化方法構建相同的對象(即,不同的文件是獨立的,但是用不同的佈局表示相同類型的數據),則不預先知道哪個序列化方法已經被恐怕唯一的解決辦法就是蠻橫的反序列化。您可以擁有一組閱讀器,每種輸入類型都有一個閱讀器,並嘗試解析文件,如果文件失敗,下一個文件開始等等,直到您發現新的文件格式或找到合適的閱讀器。我不認爲有任何模式可以解決這個問題。