新手需要知道如何解析这样的整个文本组

时间:2009-10-07 22:00:40

标签: c# .net

我需要解析一个包含大约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";

解析这个问题的最佳方法是什么?

我该如何开始?

2 个答案:

答案 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