2016-11-02 6 views
0

Я пытаюсь проверить, если большой текст документа около 500 000 строк содержит определенную строку, и проблема, если я считаю, это так:Как найти конкретную строку с уникальным содержанием строки в большой текстовый документ

string searchLine = "line 4"; 

using (StreamReader sr = new StreamReader(filePath)) 
{ 
    string contents = sr.ReadToEnd(); 
    if (contents.Contains(searchLine)) 
    { 
     Console.WriteLine("line exist"); 
    } 
    else 
    { 
     Console.WriteLine("line does not exist"); 
    } 
} 

и содержание документа, и я не принимаю письма дубликатов к нему, все строки являются уникальными:

line 1 
line 2 
line 3 
line 4 
line 5 
line 47 

Так что я получил ответ, что это «линия существовать» для «линии 4» Хорошо, но потом, если я удалить его из порядок и файл проверки для той же строки «строка 4» снова, он говорит, что «линия существует», потому что кажется lik e он находит все 4 числа в текстовом файле, и только если я удалю «line47», тогда «строка не существует».

Так что мне интересно, как найти определенную строку с уникальным строковым контентом в большом текстовом документе.

+0

Вы уверены, что это ** линия 74 ** вводит в заблуждение? Я верю, что нет. Возможно, вы можете попробовать найти с помощью notepad ++/ultraedit. –

+0

Вы можете включить 'Environment.NewLine' в свою' searchLine'. И как сказал Лэй Ян, ** строка 74 ** должна ли быть ** строка 47 **? – Prisoner

+0

Содержит не обрабатывает случай, когда в строке есть все символы, которые вы ищете, и больше символов, следующих за этим. Итак, да, линия 47, подобная @Alex, вернется. –

ответ

1

sr.ReadToEnd(); делает не прочитать файл построчно, но читает все символы от текущей позиции до конца потока.

Хотя метод Readline() считывает строку символов из текущего потока и возвращает данные в виде строки

Метод Readline() будет читать файл строка за строкой, как так:

string currentLine; 
bool exist = false; 

using (StreamReader sr = new StreamReader(filepath)) 
{ 
    while ((currentLine = sr.ReadLine()) != null) 
    { 
     if (currentLine == "line 4") 
      exist = true;      
    } 
} 

Console.WriteLine(exist ? "line exist" : "line does not exist"); 

В качестве альтернативы вы также можно сравнить с:

string.Equals(currentLine, "line 4") 

вместо

currentLine == "line 4" 
+0

Я бы предложил 'String.equals', если все, что вам нужно, это строка на line, и до того, как вы попросите время, чтобы прочитать 500000 строк, ничтожно. –

+0

@ Jim да, что я ищу, отлично работает, и да, возврат должен быть bool, чтобы точно знать о единственной строке или нет, предыдущее решение также было хорошим, но оно возвращает из всей строки, заданной и не заданной строки –

+0

ваш приветственный Тим. * (добавлено в сообщение Paul, спасибо) * – Jim

0

Вы можете использовать следующий код для поиска точного содержимого.

public string ExactReplace(string input, string find, string replace) 
{ 
    string textToFind = string.Format(@"\b{0}\b", find); 
    return Regex.Replace(input, textToFind, replace); 
} 

, а затем вы можете назвать это как

string fulltext = sr.ReadToEnd(); 
string result = text.ExactReplace(fulltext, "line 4", ""); 

Метасимволом \b является якорем, как каретка и знак доллара. Он соответствует позиции, которая называется «границей слов». Это совпадение равно нулю.

Есть три различных положения, которые квалифицируются как границы слова:

  • До первого символа в строке, если первый символ является символ слова.
  • После последнего символа в строке, если последний символ является символом слова.
  • Между двумя символами в строке, где один является символом слова, а другой не является символом слова.

Для более на Word Boundaries

+0

Решение Jim above делает именно то, что я задал, но похоже, что это решение тоже полезно –

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

  • Нет связанных вопросов^_^