我需要解析一个包含大约10000个分组的文本文件,比如
group "C_BatTemp" -- block-group
{
block: "Constant"
flags: BLOCK|COLLAPSED
}
-- Skipping output Out1
p_untitled_P_real_T_0[1]
{
type: flt(64,IEEE)*
alias: "Value"
flags: PARAM
}
endgroup -- block-group "C_BatTemp"
我期望解析器填充的所需对象看起来像这样
string Varname = "C_BatTemp";
string GroupType = "Constant";
string BaseAdressName = "p_untitled_P_real_T_0";
int AdressOffset = 1; // number in parenthesis p_untitled_P_real_T_0[1]<----
string VarType = "flt(64, IEEE)";
bool IsPointer = true; // true if VarType is "flt(64, IEEE)*" ,
//false if "flt(64, IEEE)"
string VarAlias = "Value";
解析这个问题的最佳方法是什么?
我该如何开始?
答案 0 :(得分:0)
我最近不得不做类似的事情。
将每个数据块分成记录(这些是你的“群组”吗?)。使用正则表达式从每个记录中提取所需的每个元素。
如果没有更清楚的数据,我就无法详细说明。
答案 1 :(得分:0)
一种解决方案可能是使用正则表达式。我很快就编造了一个,但它可能需要一些额外的调整以满足您的确切需求。它适用于您的示例,但可能无法用于其他输入。该表达式非常适合给定的示例,特别是关于换行符和注释。
<强> CODE 强>
String input =
@"group ""C_BatTemp"" -- block-group
{
block: ""Constant""
flags: BLOCK|COLLAPSED
}
-- Skipping output Out1
p_untitled_P_real_T_0[1]
{
type: flt(64,IEEE)*
alias: ""Value""
flags: PARAM
}
endgroup -- block-group ""C_BatTemp""";
String pattern = @"^group\W*""(?<varname>[^""]*)""[^{]*{\W*block:\W*""(?<grouptype>[^""]*)""[^}]*}$(\W*--.*$)*\W*(?<baseaddressname>[^[]*)\[(?<addressoffset>[^\]]*)][^{]*{\W*type:\W*(?<vartype>.*)$\W*alias:\W*""(?<alias>[^""]*)""[^}]*}\W*endgroup.*$";
foreach (Match match in Regex.Matches(input.Replace("\r\n", "\n"), pattern, RegexOptions.Multiline))
{
Console.WriteLine(match.Groups["varname"].Value);
Console.WriteLine(match.Groups["grouptype"].Value);
Console.WriteLine(match.Groups["baseaddressname"].Value);
Console.WriteLine(match.Groups["addressoffset"].Value);
Console.WriteLine(match.Groups["vartype"].Value);
Console.WriteLine(match.Groups["vartype"].Value.EndsWith("*"));
Console.WriteLine(match.Groups["alias"].Value);
}
<强>输出强>
C_BatTemp
Constant
p_untitled_P_real_T_0
1
flt(64,IEEE)*
True
Value