2012-05-31 71 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

正则表达式的方法是相当灵活的,因为它会即使性质或空格数量的顺序改变工作。

相关问题