0

我在尝试从文本文件中解析键值对时遇到问题。我一直在寻找可以做我想做的事情的库,因为我没有能力创建一个可以做到这一点的类。

这是我文件的开头以及部分注释掉的文本和键值对:

#!version:1.0.0.1

##File header "#!version:1.0.0.1" can not be edited or deleted, and must be placed in the first line.##

#######################################################################################
##                           Account1 Basic Settings                                 ##       
#######################################################################################

account.1.enable = 1
account.1.label = Front
account.1.display_name = Front

我要做的是获取这些值,并能够将它们更新到文件中它们所在位置的文件中,因为这些文件需要保持人类可读性。

我已经查看了 Nini,因为这个库似乎能够做我想做的事,但是我继续遇到的错误是基于我的文件的第 1 行,因为它不是键值对。

Expected assignment operator (=) - Line: 1, Position: 19.

我通读了 Nini 的源代码,似乎有一种方法可以让读者使用 Mysqlstyle,它会使用“#”作为注释,但我不确定如何调整它或者它是否是自动完成的完全在我头上。

我知道我的文件不是合法的 ini 文件,并且 Nini 库中可能存在限制,因为它搜索键值对所在的部分。

我尝试用来解析和显示此文本以使用 Nini 编辑的代码如下:

public void EditCFG(string file)
{
    if (!string.IsNullOrWhiteSpace(file))
    {
        IniConfigSource inifile = new IniConfigSource(file);
        account_1_display_name.Text = inifile.Configs[""].Get("account.1.display.name");
    }
}

有人可以指出我正确的方向吗?

编辑

感谢@rowland-shaw,我找到了解决方案:

    private IConfigSource source = null;

    public void EditCFG(string file)
    {
        if (!string.IsNullOrWhiteSpace(file))
        {
            IniDocument inifile = new IniDocument(file, IniFileType.MysqlStyle);
            source = new IniConfigSource(inifile);
            account_1_display_name.Text = source.Configs["account"].Get("account.1.display_name");
        }
    }

然而,这并不完全是答案。我还必须在文件中实现部分。在用更新的文本测试我的设备后,一切都成功了。

4

3 回答 3

0

如果这就是key = value文件中的格式(和 # 用于注释),您可以执行以下操作(c# pseudocode-ish,您可以自己做一些琐碎的事情):

Dictionary<string, string> dictionary;
foreach(string line in file)
{
    if(string.IsNullOrWhiteSpace(line)) continue;

    // Remove extra spaces
    line = line.Trim();
    if(line[0] == '#') continue;

    string[] kvp = line.Split('=');
    dictionary[kvp[0].Trim()] = kvp[1].Trim(); // kvp[0] = key, kvp[1] = value
}

然后你可以使用创建的字典,如account_1_display_name.Text = dictionary["account.1.display.name"];

于 2016-01-06T17:23:34.293 回答
0

您需要指定IniFileType,即:

IniConfigSource inifile = new IniConfigSource(file, IniFileType.MysqlStyle);

长示例:

IniDocument inifile = new IniDocument(file, IniFileType.MysqlStyle);
IniConfigSource source = new IniConfigSource(inifile);
于 2016-01-06T17:25:44.940 回答
0

我可以推荐我的库Nager.ConfigParser,您可以通过 nuget 轻松获得它们。

这里是您的配置示例

var config = "#comment1\r\naccount.1.enable = 1\r\naccount.1.label = Front";

var configConvert = new ConfigConvert();
var item = configConvert.DeserializeObject<AccountCollection>(config);

public class AccountCollection
{
    [ConfigKey("account.")]
    [ConfigArray]
    public Account[] Accounts { get; set; }
}

public class Account : ConfigArrayElement
{
    public int Enable { get; set; }
    public string Label { get; set; }
    [ConfigKey("display_name")]
    public string DisplayName { get; set; }
}
于 2020-01-31T21:10:21.430 回答