24

如果字符串比较,我想在 txt 文件中找到一个字符串,它应该继续读取行,直到我用作参数的另一个字符串。

例子:

CustomerEN //search for this string
...
some text which has details about the customer
id "123456"
username "rootuser"
...
CustomerCh //get text till this string

否则,我需要详细信息才能与他们合作。

我正在使用 linq 搜索“CustomerEN”,如下所示:

File.ReadLines(pathToTextFile).Any(line => line.Contains("CustomerEN"))

但是现在我一直坚持阅读行(数据)直到“CustomerCh”来提取细节。

4

5 回答 5

31

如果您的一对行只会在您的文件中出现一次,您可以使用

File.ReadLines(pathToTextFile)
    .SkipWhile(line => !line.Contains("CustomerEN"))
    .Skip(1) // optional
    .TakeWhile(line => !line.Contains("CustomerCh"));

如果您可以在一个文件中多次出现,则最好使用常规foreach循环 - 读取行,跟踪您当前是在客户内部还是外部等:

List<List<string>> groups = new List<List<string>>();
List<string> current = null;
foreach (var line in File.ReadAllLines(pathToFile))
{
    if (line.Contains("CustomerEN") && current == null)
        current = new List<string>();
    else if (line.Contains("CustomerCh") && current != null)
    {
        groups.Add(current);
        current = null;
    }
    if (current != null)
        current.Add(line);
}
于 2012-10-12T10:02:45.180 回答
13

你必须使用while因为foreach不知道索引。下面是一个示例代码。

int counter = 0;
string line;

Console.Write("Input your search text: ");
var text = Console.ReadLine();

System.IO.StreamReader file =
    new System.IO.StreamReader("SampleInput1.txt");

while ((line = file.ReadLine()) != null)
{
    if (line.Contains(text))
    {
        break;
    }

    counter++;
}

Console.WriteLine("Line number: {0}", counter);

file.Close();

Console.ReadLine();
于 2012-10-12T10:05:56.510 回答
4

使用 LINQ,您可以使用SkipWhile/TakeWhile方法,如下所示:

var importantLines = 
    File.ReadLines(pathToTextFile)
    .SkipWhile(line => !line.Contains("CustomerEN"))
    .TakeWhile(line => !line.Contains("CustomerCh"));
于 2012-10-12T10:02:43.077 回答
2

如果你只想要一个第一个字符串,你可以使用简单的 for 循环。

var lines = File.ReadAllLines(pathToTextFile);

var firstFound = false;
for(int index = 0; index < lines.Count; index++)
{
   if(!firstFound && lines[index].Contains("CustomerEN"))
   {
      firstFound = true;
   }
   if(firstFound && lines[index].Contains("CustomerCh"))
   {
      //do, what you want, and exit the loop
      // return lines[index];
   }
}
于 2012-10-12T10:01:37.277 回答
0

我使用了 Rawling 在此处发布的方法,以在同一文件中找到不止一行,直到最后。这对我有用:

                foreach (var line in File.ReadLines(pathToFile))
                {
                    if (line.Contains("CustomerEN") && current == null)
                    {
                        current = new List<string>();
                        current.Add(line);
                    }
                    else if (line.Contains("CustomerEN") && current != null)
                    {
                        current.Add(line);
                    }
                }
                string s = String.Join(",", current);
                MessageBox.Show(s);
于 2017-06-09T19:01:28.733 回答