2012-05-31 74 views
0

可以說我有類定義是這樣的(很簡單):一個簡單的方法來解析字符串鍵值對

class Person 
{ 
    public string Balance; 
    public string Escrow; 
    public string Acc; 
    // .. and more 

} 

,我需要這個字符串解析爲上述類:

BALANCE:  746.67  ESCROW PAYMENT:  271.22  LAST ACT:05/03/12 
ACC: 10     YTD DIVIDENDS:   .27 ENTRY DATE:12/20/10 

字符串出現在這個奇怪的格式。

我想讀每一行逐一解析它的內容,但我想也許學習一種更好的方式。至少有兩個大腦比一個大腦強壯。

+0

您需要能夠區分標題(屬性名稱)中的數據。有沒有什麼規則可以用來做到這一點?標題總是至少有兩個空格嗎?或者,你可以假設標題字符串總是完全一樣嗎? – phoog

回答

1

如果字符串總是那樣的格式,那麼你應該能夠公正各執一「:」字符和索引到數組。

public Person ParsePerson(string line1, string line2) 
{ 
    string[] fields1 = line1.Split(new char[] {':', ' '}, StringSplitOptions.RemoveEmptyEntries); 
    string[] fields2 = line2.Split(new char[] {':', ' '}, StringSplitOptions.RemoveEmptyEntries); 
    return new Person() { 
    Balance = fields1[1], 
    Escrow = fields1[3], 
    Acc = fields1[1] 
    }; 
} 
+1

可能有更好的運氣把它當作一個固定寬度的文件,而不是試圖找到一個好的分隔符。看起來,空格在那裏正是爲了使它成爲一個固定寬度的文件。 – Servy

+0

嗯,我不認爲它工作正常。請檢查圖像:http://imgur.com/IFdLI – Tarik

+0

@Braveyard我不好,忘了現在刪除空格 – JaredPar

1

你可以使用一個regular expression提取值每個屬性從源字符串,像這樣:

using System.Text.RegularExpressions; 
... 
Regex balanceRegex = new Regex("(?<=BALANCE:\\s*)[^\\s]+"); 
string balance = balanceRegex.Match(source).Value; 

這可以在一個功能包裹起來,以搜索任何像這樣的命名屬性:

private static string GetProperty(string source, string propertyName) 
{ 
    string pattern = String.Format("(?<={0}:\\s*)[^\\s]+", propertyName); 
    Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); 
    return regex.Match(source).Value; 
} 

然後,你可以填寫一個Person對象是這樣的:

Person person = new Person 
{ 
    Balance = GetProperty(source, "Balance"), 
    Escrow = GetProperty(source, "Escrow Payment"), 
    Acc = GetProperty(source, "Acc") 
}; 

您可能需要調整規則運算,例如,你有空白你的屬性值,例如ACCOUNT NAME: MR SMITH

正則表達式的方法是相當靈活的,因爲它會即使性質或空格數量的順序改變工作。

相關問題