Подтвердить что ты не робот

С# строка поиска в txt файле

Я хочу найти строку в txt файле, если строка сравнивается, она должна продолжать чтение строк до другой строки, которую я использую в качестве параметра.

Пример:

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

Мне нужны детали для работы с ними в противном случае.

Я использую linq для поиска "CustomerEN" следующим образом:

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

Но теперь я застрял с чтением строк (данных) до "CustomerCh" для извлечения деталей.

4b9b3361

Ответ 1

Если ваша пара строк появится только один раз в вашем файле, вы можете использовать

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

Ответ 2

Вы должны использовать 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();

Ответ 3

С LINQ вы можете использовать методы SkipWhile/TakeWhile, например:

var importantLines = 
    File.ReadLines(pathToTextFile)
    .SkipWhile(line => !line.Contains("CustomerEN"))
    .TakeWhile(line => !line.Contains("CustomerCh"));

Ответ 4

Если вы хотите только одну первую строку, вы можете использовать простой для цикла.

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];
   }
}

Ответ 5

Я немного поработал с методом, который 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);