从字符串中获取特定行的数据
Getting specific lines of data from a string
我使用 Mailkit,它具有获取电子邮件正文文本的功能 GetMessage().Textbody
,我想获取包含特定字符串的特定行电子邮件正文
例如:
12313 banana milkshake
12356 choco milkshake
kiwi milkshake 1231313
然后继续....
我想从 700 行电子邮件正文中只获取包含单词“kiwi”和“choco”的 2 行
Using reader As New StreamReader("mail.txt")
While Not reader.EndOfStream
Dim line As String = reader.ReadLine()
If line.Contains("kiwi" or "choco") Then
Console.WriteLine(line)
Exit While
End If
End While
End Using
我一直在尝试找到一种更好更快的方法,而不是将字符串保存到文件然后使用这个
你不能像这样在函数调用中使用 or
;您需要两个单独的 Contains()
调用。此外,这可以 way 更短:
Dim lines = File.ReadLines("mail.txt").
Where(Function(line) line.Contains("kiwi") OrElse line.Contains("choco"))
For Each line As String In lines
Console.WriteLine(line)
Next
但这仍然假定 mail.txt
文件。给定一个像 Textbody
这样的字符串,我们可以编写这个函数:
Public Iterator Function GetLines(input As String) As IEnumerable(Of String)
Dim line As String = Nothing
Using rdr As New StringReader(input) ' Not StreamReader!
line = rdr.ReadLine()
While line IsNot Nothing
Yield line
line = rdr.ReadLine()
End While
End Using
End Function
然后用它来替换我原始示例中的 File.ReadLines()
,如下所示:
Dim lines = GetLines(GetMessage().Textbody).
Where(Function(line) line.Contains("kiwi") OrElse line.Contains("choco"))
For Each line As String In lines
Console.WriteLine(line)
Next
看这里:
如果您开始添加更多搜索词,所有 OrElse
表达式都变得乏味,您可以这样做:
Dim toSearch() As String = {"kiwi", "choco"}
Dim lines = GetLines(GetMessage().Textbody).
Where(Function(line) toSearch.Any(Function(key) line.Contains(key)))
For Each line As String In lines
Console.WriteLine(line)
Next
看这里:
在 c# 中因为我不知道 vb.net 但你可以翻译
string msg = GetMessage().TextBody();
var lines = msg.Split('\n');
var res = lines.Where(l=>(l.Contains("kiwi") || l.Contains("choco")));
如果 linq 的东西不能很好地转化为 vb.net 那么就做
var res = new List<string>();
foreach(var l in lines)
{
if (l.Contains("kiwi") || l.Contains("choco"))
{
res.Add(l);
}
}
我使用 Mailkit,它具有获取电子邮件正文文本的功能 GetMessage().Textbody
,我想获取包含特定字符串的特定行电子邮件正文
例如:
12313 banana milkshake 12356 choco milkshake kiwi milkshake 1231313
然后继续....
我想从 700 行电子邮件正文中只获取包含单词“kiwi”和“choco”的 2 行
Using reader As New StreamReader("mail.txt")
While Not reader.EndOfStream
Dim line As String = reader.ReadLine()
If line.Contains("kiwi" or "choco") Then
Console.WriteLine(line)
Exit While
End If
End While
End Using
我一直在尝试找到一种更好更快的方法,而不是将字符串保存到文件然后使用这个
你不能像这样在函数调用中使用 or
;您需要两个单独的 Contains()
调用。此外,这可以 way 更短:
Dim lines = File.ReadLines("mail.txt").
Where(Function(line) line.Contains("kiwi") OrElse line.Contains("choco"))
For Each line As String In lines
Console.WriteLine(line)
Next
但这仍然假定 mail.txt
文件。给定一个像 Textbody
这样的字符串,我们可以编写这个函数:
Public Iterator Function GetLines(input As String) As IEnumerable(Of String)
Dim line As String = Nothing
Using rdr As New StringReader(input) ' Not StreamReader!
line = rdr.ReadLine()
While line IsNot Nothing
Yield line
line = rdr.ReadLine()
End While
End Using
End Function
然后用它来替换我原始示例中的 File.ReadLines()
,如下所示:
Dim lines = GetLines(GetMessage().Textbody).
Where(Function(line) line.Contains("kiwi") OrElse line.Contains("choco"))
For Each line As String In lines
Console.WriteLine(line)
Next
看这里:
如果您开始添加更多搜索词,所有 OrElse
表达式都变得乏味,您可以这样做:
Dim toSearch() As String = {"kiwi", "choco"}
Dim lines = GetLines(GetMessage().Textbody).
Where(Function(line) toSearch.Any(Function(key) line.Contains(key)))
For Each line As String In lines
Console.WriteLine(line)
Next
看这里:
在 c# 中因为我不知道 vb.net 但你可以翻译
string msg = GetMessage().TextBody();
var lines = msg.Split('\n');
var res = lines.Where(l=>(l.Contains("kiwi") || l.Contains("choco")));
如果 linq 的东西不能很好地转化为 vb.net 那么就做
var res = new List<string>();
foreach(var l in lines)
{
if (l.Contains("kiwi") || l.Contains("choco"))
{
res.Add(l);
}
}