读取特定文本部分的文本,并将剩余行作为键值对返回



我有一个文件,其中包含如下客户代码列表

[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());

将所有新行的字符串拆分为一个列表。然后使用列表查找索引查找客户代码标头并跳过它,然后将所有后续行转换为名称/代码字典。

最新更新