使用linq查询从文件中获取键值

本文关键字:获取 键值 文件 linq 查询 使用 | 更新日期: 2023-09-27 18:16:16

一个文件夹中有多个文件,代码应该逐个读取。我必须从文件中提取一些键值来执行一些业务逻辑。

文件看起来像这样,

x-sender: 
x-receiver: 
Received: 
X-AuditID:
Received: 
Received: 
From: 
To: 
Subject: 
Thread-Topic: 
Thread-Index: 
Date: 
Message-ID: 
Accept-Language: 
Content-Language: 
X-MS-Has-Attach:

有多个键可以根据每个文件增加或减少。键的顺序也可以更改。每个键都有一定的值。

代码:

 private void BtnStart_Click(object sender, EventArgs e)
        {
            // searches current directory
                foreach (string file in Directory.EnumerateFiles(NetWorkPath, "*.eml"))
                {
                    var dic = File.ReadAllLines(file)
                                .Select(l => l.Split(new[] { ':' }))
                                .ToDictionary(s => s[0].Trim(), s => s[1].Trim());
                    string myUser = dic["From"];
            }
        }

我试图读取文件并将其转换为字典,以便我可以通过使用密钥访问。但是它给了我一个错误"An item with the same key has already been added.".

帮忙吗? ?

使用linq查询从文件中获取键值

可以用ToLookup代替ToDictionary

......same code....
.Where(s => s.Length>1)
.ToLookup(s => s[0].Trim(), s => s[1].Trim());

然后你可以检查

string myUser = dic["From"].FirstOrDefault();

这是因为Receieved在那里多次和Dictionary不允许重复条目为它的键值。

您可以使用Tuple<string, string>,这将允许重复。

如果你不想返回它,你可以使用一个匿名类型:

foreach (string file in Directory.EnumerateFiles(NetWorkPath, "*.eml"))
{
    var items = myList
        .Select(l => l.Split(new [] {':' }, StringSplitOptions.RemoveEmptyEntries))
        .Where(l => l != null && l.Count() == 2)
        .Select(l => new
        {
            Key = l[0],
            Value = l[1],
        })
        .ToList();
    string myUser = items.First(i => i.Key == "From").Value;
}

您有两个相同名称的元素已收到:

这意味着你已经在字典中添加了两次相同的键,收到: