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

时间:2019-01-03 15:41:43

标签: c#

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

[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;
    }

有更简单的方法吗?希望对此有一些指导。我是这个新手,如果过分的话,请原谅我

2 个答案:

答案 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]);

简短易读。

第一行将您带到代码开始的部分,然后按行然后按键/值将其拆分。