我正在编写一个具有非常松散定义的配置文件的应用程序,该文件在启动期间被读入。该文件易于解析,看起来如下所示:
tag1 = value1
tag2 = value2
tag3 = value3
tag4 = value4
标签和值是用户可能想要配置的信息。正如我之前所说,该文件是松散定义的 - AKA,我不需要所有(或任何)字段,并且值不必按任何特定顺序排列。唯一真正的规则是它必须采用上述格式,并且我不认识的任何标签都会被忽略。
在解析上述约束时,有没有什么好方法可以检查文件是否有效?我正在使用.NET运行时的C#,2.0.x版进行开发。谢谢。
答案 0 :(得分:3)
我建议使用正则表达式将文件解析为字典。您可以在读取文件之前将所有支持的键的默认值添加到字典中。通过这种方式,您可以获得具有一致键集的字典,而不依赖于文件中的键。在这种情况下,您可以进一步考虑添加支持的密钥列表,并在读取报告不支持密钥的文件时检查此列表中的每个密钥。
const String fileName = @"foo.ini";
const String entryExpression = @"^\s*(?<key>[a-zA-Z][a-zA-Z0-9]*)\s*=" +
@"\s*(?<value>[a-zA-Z][a-zA-Z0-9]*)\s*$";
Dictionary<String,String> entries = new Dictionary<String, String>();
foreach (String line in File.ReadAllLines(fileName))
{
Match match = Regex.Match(line, entryExpression);
if (match.Success)
{
String key = match.Groups["key"].Value;
String value = match.Groups["value"].Value;
if (entries.ContainsKey(key))
{
Console.WriteLine("Overwriting the key '{0}'.", key);
}
entries[key] = value;
}
else
{
Console.WriteLine("Detected malformed entry '{0}'.", line);
}
}
答案 1 :(得分:1)
为什么要这么麻烦?
你已经说过你忽略任何无效的东西。
您可以在每一行搜索' = '
,但如果没有任何费用可能会导致文件无效。
或者,您可以在顶部放置一个版本
#footype=1
然后只是寻找(通常是好的做法,因为当你稍微改变文件布局时)
答案 2 :(得分:0)
随意观察;格式将传递给python - 所以如果你想使用一些预先存在的代码并提供更多的灵活性,你可以嵌入IronPython并使用它来解析(执行)配置文件。这将告诉您任何错误,并且(成功时)应通过查找使值可用。
可能是矫枉过正 - 但实际上灵活的配置脚本(作为DSL)对于python来说是一个强项。