我有一个文件,其中包含以下客户代码列表
[NationalCode]
NAT1=IRE
NAT2=LON
NAT3=DUB
[customercodes]
code1=Emer
code2=John
code3=Patrick
code4=Sarah
我想读取customercodes部分中的值,并将它们作为键值对放入字典中。我已经完成了以下操作,但始终给我一个错误。我只需要遍历customercodes部分之后的行
public Dictionary<string, string> ParseSect(string Data)
{
string ini = File.ReadAllText(Data);
var lines = ini.Split(new[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
var dict = new Dictionary<string, string>();
var rows = lines.Where(t => !String.IsNullOrEmpty(t.Trim()) && !t.StartsWith(";") && (t.Contains('[') || t.Contains('=')));
if (rows == null || rows.Count() == 0) return dict;
string section = "";
foreach (string row in rows)
{
if (row == "[customercodes]")
{
section = "customercodes";
string rw = row.TrimStart();
int index = rw.IndexOf('=');
dict[rw.Substring(0, index).Trim()] = rw.Substring(index + 1).Trim().Trim('"'); //Here is where I am getting an error
}
}
return dict;
}
有更简单的方法吗?希望对此有一些指导。我是这个新手,如果过分的话,请原谅我
答案 0 :(得分:0)
因此,在您的特定示例中,您实际上像对待客户代码一样处理标题行-寻找分隔符=
却找不到它,这会导致您的错误。我的建议是将您的某些解析分解为较小的表达式,以便它们更易于遵循,阅读和调试:
string name = rw.Substring(0, index).Trim();
string code = rw.Substring(index + 1).Trim().Trim('"');
dict[name] = code;
关于另一种方法,这是一个快速的LINQ示例(尽管这与我先前的建议相反,以使其保持可读性!):
var lines = s.Split('\n').ToList();
var dict = lines.Skip(lines.FindIndex(l => l.StartsWith("[customercodes]")) + 1)
.ToDictionary(k => k.Substring(k.IndexOf('=') + 1).Trim(),
v => v.Substring(0, v.IndexOf('=')).Trim());
将所有新行将字符串分割成一个列表。然后使用列表查找索引查找客户代码标头并跳过它,然后将所有后续行转换为名称/代码字典。
答案 1 :(得分:0)
尝试一下
var codes = s.Substring(s.IndexOf("[customercodes]") + "[customercodes]".Length);
var pairs = codes.Split(new[] { '\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
var dictionary = pairs.Select(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]);
简短易读。
第一行将您带到代码开始的部分,然后按行然后按键/值将其拆分。