我有一个文件,其中包含如下客户代码列表
[NationalCode]
NAT1=IRE
NAT2=LON
NAT3=DUB
[customercodes]
code1=Emer
code2=John
code3=Patrick
code4=Sarah
我想读取客户代码部分中的值,并将它们作为键值对放入字典中。我已经完成了以下操作,但它一直给我一个错误。我只需要遍历客户代码部分之后的行
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;
}
有没有更简单的方法可以做到这一点? 将不胜感激对此的一些指导。我是这方面的新手,所以如果做得过头了,请原谅我
试试这个
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]);
它简短且可读。
第一行将您带到代码开始的部分,然后按行拆分,然后按键/值拆分。
在您的特定示例中,您实际上像处理客户代码一样处理标题行 - 您查找分隔符=
但找不到它,这会导致您的错误。我的建议是将一些解析分解为较小的表达式,以便它们更易于遵循、阅读和调试:
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());
将所有新行的字符串拆分为一个列表。然后使用列表查找索引查找客户代码标头并跳过它,然后将所有后续行转换为名称/代码字典。