2013-10-10 2 views
-2

Хотите найти строку в файле, после того как я найден, я хотел бы перейти к предыдущей и найти другую строку и, наконец, получить завершающие символы строки.Поиск нескольких строк в текстовом файле в C#

Скажем, мой текст в файле идет как

линия 1 ------------ образец текста контрагент = "ABCD" detailsprogrammed ... так далее

линии 2 ------------ это строка два продукта = "12345" и продолжается

Я хочу сначала найти 12345, что является уникальным. После того, как обнаружил, что я хочу, чтобы перейти к предыдущей строке и поиск первого вхождения контрагента и однажды обнаружили, что я хотел бы, чтобы захватить строковый ABCD

+0

Почему вы просто не читаете от конца файла до первой строки? –

+3

Вы показываете две строки, где ваши 3 линии назад логики? Что вы пробовали? –

+2

Это пахнет домашней работой ... :) – jsmith

ответ

2

Вы можете просто кэш-линии перед каждой итерацией:

string prevLine = ""; 
while((line = reader.ReadLine()) != null) 
{ 
    if (line.contains("12345")) 
    { 
     textIWant = prevLine.Substring(//..etc 
    } 
    prevLine = line; 
} 

Вы можете продолжить один и тот же шаблон, если вам нужно пройти более 1 строки, но, очевидно, это становится беспорядочным, если вам нужно вернуться более чем на 1 или 2. Если файл не такой большой, вы также можете прочитать все это и просто кешируйте все строки, но это не будет хорошо, если файлы могут быть очень большими и, таким образом, захватить большой кусок памяти для кэширования всех сразу.

+0

_ «Я хотел бы пойти 3 линии назад» _ –

+2

@TimSchmelter Да, я решил ответить на его примерный вопрос, так как это то, что он дал особенностям –

0

Вы можете использовать регулярные выражения (System.Text.RegularExpressions). Сначала прочитайте кусок строк и соедините их вместе. Затем передайте их методу Match объекта Regex.

Предполагая, что вы хотите вернуться на три линии, вы можете сделать что-то подобное.

Regex RX = new Regex(@"counterparty=""([^""]*)"" (.*?\n){3}product=""12345""", 
     RegexOptions.Singleline | RegexOptions.IgnoreCase); 

Match M = RX.Match(YourString); 

if (M.Success) 
    strCounterParty = M.Result("${1}"); //Returns the value between the 1st set of()'s 

Таким образом, вы будете соответствовать только номеру продукта, а не другому значению, которое также имеет значение 12345.

Смежные вопросы