ini-parser 2.5.2解析含重复键的INI文件时触发Duplicate Key异常的解决方法咨询
ini-parser 2.5.2解析含重复键的INI文件时触发Duplicate Key异常的解决方法咨询
我最近在.NET 4.7的项目里刚装了ini-parser 2.5.2,测试的时候遇到了个棘手的问题——我的INI文件里有重复的键值对,解析的时候直接抛出了重复键的异常,想问问大家有没有办法解决?
问题场景
我的INI文件里的INSTANCES section结构如下:
[INSTANCES] NUMVTC=3 VTC=0,3330,ABCD,Descr1 VTC=1,3331,EFGH,Descr2 VTC=2,3332,IJKL,Descr3
最初的尝试与报错
我写了个方法尝试读取所有VTC的value,代码如下:
public static List<string> GetIniSectionData(string iniFilePath, string section, string key) { List<string> ls = new List<string>(); var parser = new FileIniDataParser(); IniData data = parser.ReadFile(iniFilePath); // 此处抛出异常:Parsing exception: Duplicate key 'VTC' found in section 'INSTANCES' int cnt = data[section].Count; while(!string.IsNullOrEmpty(data[section][key])) { ls.Add(data[section][key]); } return ls; }
结果一执行到parser.ReadFile就直接炸了,提示在INSTANCES section里发现重复的VTC键。
我的临时解决办法
折腾了一阵后,发现ini-parser好像确实不原生支持重复键的场景,于是我换了个思路,直接用Linq读取文件内容来处理,绕开了这个库的限制:
var vals = File.ReadLines(sMappingFilePath) .SkipWhile(line => !line.StartsWith("[instances]", StringComparison.CurrentCultureIgnoreCase)) .Skip(1) .TakeWhile(line => !string.IsNullOrEmpty(line)) .Select(line => new { Key = line.Split('=')[0], Value = line.Split('=')[1] }); foreach (var val in vals) { string[] saValues = val.Value.Split(','); if (saValues.Length == 4) { int vtcNum = Convert.ToInt16(saValues[0]); int vtcPort = Convert.ToInt16(saValues[1]); string vtcName = saValues[2]; string vtcDescr = saValues[3]; // 这里处理拆分后的业务数据 } }
不过这个方法我还没经过充分测试,暂时不确定健壮性如何,后续可能会遇到格式不规范的情况出问题,但目前能满足我的需求。
想问问大家,有没有更优雅的办法解决ini-parser的重复键问题?或者有没有其他支持重复键的INI解析库推荐?
内容来源于stack exchange
相关产品推荐
相关产品推荐

