验证松散定义的文件

时间:2009-09-27 23:07:40

标签: c# file parsing

我正在编写一个具有非常松散定义的配置文件的应用程序,该文件在启动期间被读入。该文件易于解析,看起来如下所示:

tag1 = value1
tag2 = value2
tag3 = value3
tag4 = value4

标签和值是用户可能想要配置的信息。正如我之前所说,该文件是松散定义的 - AKA,我不需要所有(或任何)字段,并且值不必按任何特定顺序排列。唯一真正的规则是它必须采用上述格式,并且我不认识的任何标签都会被忽略。

在解析上述约束时,有没有什么好方法可以检查文件是否有效?我正在使用.NET运行时的C#,2.0.x版进行开发。谢谢。

3 个答案:

答案 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来说是一个强项。