我一直在尝试解析文本文件中的键值对时遇到问题。我一直在寻找可以做我喜欢的事情的图书馆,因为我没有能力创建一个可以做到这一点的课程。
以下是我的文件的开头以及一部分注释掉的文本和键值对:
#!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");
}
}
然而,这并不完全是答案。我还必须在文件中实现部分。在测试了使用更新后的文本抓取这些文件的设备后,一切都很成功。
答案 0 :(得分: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"];
答案 1 :(得分:0)
您需要specify the IniFileType
,即:
IniConfigSource inifile = new IniConfigSource(file, IniFileType.MysqlStyle);
很长的例子:
IniDocument inifile = new IniDocument(file, IniFileType.MysqlStyle);
IniConfigSource source = new IniConfigSource(inifile);
答案 2 :(得分:0)
查看你的文本文件,我想象这样的东西应该有用(现在不能用VS来检查拼写):
org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is org.apache.activemq.AlreadyClosedException: this connection
at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316)
Caused by: org.apache.activemq.AlreadyClosedException: this connection
at org.apache.activemq.pool.PooledConnection.assertNotClosed(PooledConnection.java:161)
at org.apache.activemq.pool.PooledConnection.start(PooledConnection.java:77)
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.localStart(SingleConnectionFactory.java:632)
at org.springframework.jms.connection.SingleConnectionFactory$SharedConnectionInvocationHandler.invoke(SingleConnectionFactory.java:569)
at com.sun.proxy.$Proxy52.start(Unknown Source)
at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:487)
答案 3 :(得分: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; }
}