2011-09-24 30 views
1

我最近被分配了一個任務,我需要創建一個程序來編輯Visual C#中的文件。該文件是一個具有多個固定字符寬度行的順序ASCII文本文件,其基本結構如下所示:解析順序ASCII文件進行編輯 - Visual C#

每個組是一個參數,並且文件中可以包含數百個這樣的參數。每個功率放大器都有一定數量的列,但每個功率放大器的列數都不相同。此外,每個記錄中還有一些可選字段,因此可以計算某些字段之間的額外空間。每個領域也有1個空間的分隔符。我不確定自己是否過於徹底,但我認爲我提供的信息越多,就越容易有人幫助我。

從本質上講,我想創建一個圖形用戶界面中,用戶可以選擇一個參數記憶,然後能夠參數

我有一個小C#經歷了整個集團內編輯任何字段,但我很難弄清楚什麼是最好的方法來完成這一點。我最初的想法是將文件解析爲數組,搜索每個參數名稱(可能使用正則表達式?),在瀏覽器中顯示所有參數名稱。從那裏用戶將能夠選擇他們想要編輯的參數。然後,程序會再次搜索數組中的選定參數,然後將記錄解析到文本框中,以便進行編輯。

我不確定這是否是實現此目的最有效的方式,而且我有點卡在如何實際解析文件以將字段讀入文本框中。我搜索了許多不同的論壇進行文件解析,但大多數我發現與逗號分隔的文件相關的主題並不真正適用於我正在使用的文件類型。任何幫助將不勝感激,如果你需要我詳細說明任何事情,請隨時問我。感謝您的幫助。

回答

2

這不是C#的建議,而是更一般的編程建議。如果我是你,我會創建一個類來表示你擁有的每個PA,並讓它們各自從IPAObject接口繼承(或類似的東西)。這樣你可以把它們當作抽象PA對象的子類型。

然後,我將創建一個名爲PAGroup的類,該類包含IPAObject的數組。

每個個體的具體的PA對象類將不得不爲它的每個參數字段,可從流負責serializing itself to or deserializing本身(在你的情況下,這個流可能是一個輸入或輸出文件),使用C# file API's。您可以使用正則表達式,但由於每個PA對象都有固定長度的行,所以您可以一次使用ReadLine()讀取該行,並使用數組操作對其進行解析,就像您自己所說的那樣。如果你走這條路線,我對你的建議是在每個類對象中爲每個列開始偏移和長度存儲偏移量,而不是用一大堆文字數字亂丟你的代碼。

這些類也將包含它們的列的邏輯以及如何修改該數據。你的一些專欄似乎是開放式的,所以他們可能只是用字符串表示。其他人看起來像來自一個有限的選擇列表。這些可能會由屬於相關PA對象類的常量表示。該類將負責將常量和其他對象轉換爲來自文件的實際ASCII表示。

這樣,當你讀完整個PA文件時,你最終會得到一個很好的分層數據結構來代表你的文件的結構,並且從編碼的角度來看,所有的邏輯都被很好地分開,這使得它很容易維護。這個很好的數據結構可以作爲model-view-controller體系結構中的模型。那麼你只需要擔心實現用戶界面與數據進行交互。

我希望這會有所幫助。

+0

感謝您的快速回答。我將在週一開始編寫代碼,希望一切順利。 – almostProgramming

+0

我忘記提及的是每個參數中還有其他可選的PA線。因此,例如,PA31和PA41之間可能存在PA32。我不太清楚這會如何影響你的答案,但是在寫我的第一個問題的時候,我的思想開始滑落了。此外,PAGroup課程的目的是什麼?我想它會照顧多個PA的搜索?再次感謝你的幫助。 – almostProgramming

+0

PAGroup將負責讀取初始PA ##字段,創建相應的IPAObject派生對象,將該行的其餘部分傳遞給該對象,然後在完成所有操作時包含對象列表。這樣,如果用戶決定插入新的可選PA線,PAGroup將創建一個新對象並將其放入其所屬的列表中。然後,當他們保存時,整個過程反過來。 PAGroup創建/接收輸出流,然後告訴列表中的每個對象按順序將自己寫入流。 – acjay