从字符串中获取特定行的数据

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

看这里:

https://dotnetfiddle.net/fh1G4H

如果您开始添加更多搜索词,所有 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

看这里:

https://dotnetfiddle.net/AROhWQ

在 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);
    }
}