2009-10-07 5 views
0

je dois analyser un fichier texte avec environ 10 000 groupes comme celui-ciDébutant a besoin de savoir comment analyser un groupe de texte tout comme ce

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" 

Les objets désirés Je pense que le analyseur pour remplir ressembler à ceci

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"; 

Quelle est la meilleure façon d'analyser cette ??

Comment commencer?

+1

Je pense que vous devez ajouter plus de détails sur la syntaxe de la langue que vous essayez d'analyser. Où sont les accolades requises? Il semble que la séquence '--' introduit un commentaire - est-ce vrai? Il semble que vous puissiez l'analyser avec une sorte d'automate à états finis (par exemple regex), mais en fonction des règles du langage, vous aurez peut-être besoin d'une lexique plus complexe. –

Répondre

0

Une solution peut utiliser une expression régulière. J'en ai vite fait un, mais il faudra peut-être un réglage supplémentaire pour répondre exactement à vos besoins. Cela fonctionne pour votre exemple, mais peut échouer pour d'autres entrées. L'expression est très adaptée à l'exemple donné en particulier en ce qui concerne les sauts de ligne et les commentaires.

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); 
} 

SORTIE

C_BatTemp 
Constant 
p_untitled_P_real_T_0 
1 
flt(64,IEEE)* 
True 
Value 
0

J'ai dû faire quelque chose de similaire récemment.

Divisez chaque bloc de données en enregistrements (est-ce que ce sont vos 'groupes'?). Extrayez chaque élément dont vous avez besoin de chaque enregistrement à l'aide d'expressions régulières.

Sans une idée plus claire des données que je ne peux pas élaborer.

Questions connexes