使用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.".
帮忙吗? ?
可以用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;
}
您有两个相同名称的元素已收到:
这意味着你已经在字典中添加了两次相同的键,收到: