【问题标题】:Simplest possible key/value pair file parsing in .NET.NET 中最简单的键/值对文件解析
【发布时间】:2008-11-12 18:29:40
【问题描述】:

我的项目需要一个文件,我将在其中存储用户应该能够读取和修改的键/值对数据。我希望程序只期望密钥在那里,并且我想尽快从文件中解析它们。

我可以将它们存储在 XML 中,但是 XML 太复杂了,它需要遍历节点和子节点等等,我想要的只是一些获取文件并生成键值对的类。我想要尽可能少的错误处理,并且我希望用尽可能少的代码来完成。

我可以自己编写这样的类,但我宁愿学习它在框架中的作用,也不愿两次发明轮子。 .NET (3.5) 中是否有一些内置的魔法类能够做到这一点?

MagicClass kv = new MagicClass("Settings.ini"); // It doesn't neccesarily have to be an INI file, it can be any simple key/value pair format.
string Value1 = kv.get("Key1");
...

【问题讨论】:

  • 正如@Nicholas Mancuso 指出的,XML 序列化不需要遍历节点等。

标签: c# .net key-value


【解决方案1】:

如果您正在寻找一个快速简单的功能并且不想使用 .Net 应用程序\用户配置设置文件或担心有时会出现的序列化问题。

以下静态函数可以加载格式为KEY=VALUE 的文件。

public static Dictionary<string, string> LoadConfig(string settingfile)
{
    var dic = new Dictionary<string, string>();

    if (File.Exists(settingfile))
    {
        var settingdata = File.ReadAllLines(settingfile);
        for (var i = 0; i < settingdata.Length; i++)
        {
            var setting = settingdata[i];
            var sidx = setting.IndexOf("=");
            if (sidx >= 0)
            {
                var skey = setting.Substring(0, sidx);
                var svalue = setting.Substring(sidx+1);
                if (!dic.ContainsKey(skey))
                {
                    dic.Add(skey, svalue);
                }
            }
        }
    }

    return dic;
}

注意:我使用的是字典,所以键必须是唯一的,这通常是设置的情况。

用法:

var settingfile = AssemblyDirectory + "\\mycustom.setting";
var settingdata = LoadConfig(settingfile);
if (settingdata.ContainsKey("lastrundate"))
{
    DateTime lout;
    string svalue;
    if (settingdata.TryGetValue("lastrundate", out svalue))
    {
        DateTime.TryParse(svalue, out lout);
        lastrun = lout;
    }
}

【讨论】:

    【解决方案2】:

    为您的键和值使用KeyValuePair 类,然后使用XMLSerializerList 序列化到磁盘。

    这将是我觉得最简单的方法。您不必担心遍历节点。调用 Deserialize 函数将为您完成此操作。用户也可以根据需要编辑文件中的值。

    【讨论】:

    • 必须考虑到KeyValuePair 不可序列化。在此后续问题中讨论了此处解决方案的更详细描述:stackoverflow.com/questions/2658916/…
    • 你能提供一个实际的例子吗?
    【解决方案3】:

    我不知道任何用于解析 ini 文件的内置类。我在需要时使用了nini。它在 MIT/X11 许可下获得许可,因此在封闭源代码程序中包含任何问题。

    非常好用。所以如果你有一个这样格式化的 Settings.ini 文件:

    [Configuration]
    Name = Jb Evain
    Phone = +330101010101
    

    使用起来很简单:

    var source = new IniConfigSource ("Settings.ini");
    var config = source.Configs ["Configuration"];
    
    string name = config.Get ("Name");
    string phone = config.Get ("Phone");
    

    【讨论】:

      【解决方案4】:

      如果您希望用户能够读取和修改文件,我建议使用逗号分隔的一对,每行一个

      key1,value1
      key2,value2
      ...
      

      解析很简单:读取文件,用换行符或逗号分割,然后成对取元素

      【讨论】:

      • 不妨让它在格式上等同于 Java 属性文件并使用等号而不是逗号。
      • @JeeBee: 但这会假设用户熟悉 java 属性文件格式;可以用 Excel 或记事本编辑 csv 格式
      【解决方案5】:

      以这种方式格式化文件:

      key1=value1
      key2=value2
      

      将整个文件读入一个字符串(有一个简单的便利函数可以做到这一点,可能在 File 或 string 类中),然后调用 string.Split('=')。确保在遍历列表并将每一对弹出到哈希表或字典中时,还对每个键和值调用 string.Trim()。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 2012-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多