С# строка поиска в 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" для извлечения деталей.
Ответы
Ответ 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);