[英]Deserialize a string that contains a repeating set of elements
我得到如下响应字符串:
Navigator[sizenavigator:INTEGER (Size)
modifier:size
score:1.300855517 type:INTEGER unit:kB
hits:7744
hitsUsed:7744
ratio:1
min:65
max:66780
mean:3778
sum: 29259942
frequencyError:-1
entropy:1.300855533
points:
Name:Less than 1
Interval: ->1023
Value:[;1023]
Count:1121
Name:Between 1 and 2
Interval: 1024->2047
Value:[1024;2047]
Count:3325
Name:Between 2 and 3
Interval: 2048->3071
Value:[2048;3071]
Count:1558
Name:More than 3
Interval: 3072->
Value:[3072;]
Count:1740
]
如您所见,“ 名称”,“间隔”,“值”,“计数”正在重复,并且将重复“ n”否。 的时间。 如何通过为此过程创建类型(类)来反序列化它?
假设该班级有点像:
class Navigator
{
string modifier;
string score;
.
.
string Name;
string Interval;
string Value;
int Count;
}
我们如何获得Name,Interval,Value,Count的重复值?
提前致谢。
我建议您自由使用正则表达式来提取所需的信息。 这增加了很多复杂性,但是您的另一个选择是令牌化 ,对于给定的输入,IMO的实现将同样复杂。
修饰符的正则表达式非常简单。 它要求您要查找的文本字符串“修改器:”和捕获后不管是:
直到一行的末尾-由CR LF周围限定\\r\\n
。 您可以利用捕获组来提取所需的信息,因此正则表达式为:
modifier:(.*[^\r\n])
score的正则表达式非常简单,查找文字字符串score:
并捕获:
之后的所有内容,直到该行的结尾:
score:(.*[^\n\r])
重复项的正则表达式要复杂得多,并且再次利用捕获组(这次命名为使提取它们更容易)来获取您感兴趣的信息。
Name:\s*(?<name>.*[^\r\n])\s*\r\n\s+Interval:\s(?<interval>\d*\-\>\d*)\s*\r\n\s+Value:\s*(?<value>\[\d*;\d*\])\s*\r\n\s+Count:\s*(?<count>\d+)
在名为input
的变量中给定输入数据,您将使用以下代码:
var modifierRegex = new Regex(@"modifier:(.*[^\r\n])");
var scoreRegex = new Regex(@"score:(.*[^\n\r])");
var itemsRegex = new Regex(@"Name:\s*(?<name>.*[^\r\n])\s*\r\n\s+Interval:\s(?<interval>\d*\-\>\d*)\s*\r\n\s+Value:\s*(?<value>\[\d*;\d*\])\s*\r\n\s+Count:\s*(?<count>\d+)");
var modifierMatch = modifierRegex.Match(input);
var scoreMatch = scoreRegex.Match(input);
var itemsMatches = itemsRegex.Matches(input);
var modifier = modifierMatch.Groups[1].Value;
var score = scoreMatch.Groups[1].Value;
foreach(Match match in itemsMatches)
{
var name = match.Groups["name"].Value;
var interval = match.Groups["interval"].Value;
var value = match.Groups["value"].Value;
var count = match.Groups["count"].Value;
}
实时示例: http : //rextester.com/rundotnet?code=OQTZE85773
这说明了如何提取所需的值。 现在使用@Jeremy McGee所描述的数据结构,并按照他的描述来读取值。
我认为您正在寻找的是一种将给定的文本字符串转换为某种内部C#数据结构的方法。 对于重复结构,您将需要两个类:一个用于文本的“主体”,另一个用于重复的项目:
class Navigator
{
string modifier;
string score;
.
.
List<IntervalItem> Intervals;
}
class IntervalItem
{
string Name;
string Interval;
string Value;
int Count;
}
然后在反序列化文本的代码中,如下所示:
Navigator navigator = new Navigator();
// ... populate the modifier, score, and suchlike
navigator.Intervals = new List<IntervalItem>();
while ( // something to test if we have an interval to read // )
{
IntervalItem intervalItem = new IntervalItem();
// ... populate the interval from the name, interval, value
navigator.Intervals.Add(intervalItem);
}
(您需要根据扫描文本的方式,找出一种适当的方法来测试是否还有另一个间隔可以读取。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.