Самый эффективный способ удостовериться строка существует в файле простого текста

Нет, сейчас нет. Это потенциальная РСЕ, создать для нее хиру?

5
задан Andrew Ensley 5 May 2009 в 16:57
поделиться

7 ответов

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

5
ответ дан 18 December 2019 в 10:48
поделиться

Если строка текста всегда будет одинаковой, то использование RegEx для сопоставления с текстом строки, вероятно, более эффективно, чем циклический просмотр файла для сопоставления текста с использованием String.Equals ( ) или ==.

Тем не менее, я не знаю, в любом случае в c # найти текст в файле без открытия файла в память и чтения строк.

Эта ссылка хороший учебник по использованию RegEx для сопоставления строк в файле с использованием c #.

3
ответ дан 18 December 2019 в 10:48
поделиться

Если они не очень длинные строки, в современных вычислительных терминах 1600 строк - это не много! Файл ввода-вывода будет обрабатываться средой выполнения и буферизироваться, и он будет удивительно быстрым, а объем памяти - поразительно непримечательным.

Просто прочитайте файл построчно или используйте System.IO.File. ПрочтитеAllLines () , а затем посмотрите, существует ли линия, например, используя сравнение всей строки со строкой.

Это не будет вашим узким местом.

Ваше узкое место может возникнуть, если вы часто выполняете опрос и / или использование регулярных выражений без необходимости. Лучше всего использовать средство наблюдения за файловой системой, чтобы вообще не анализировать файл, если он не изменился.

3
ответ дан 18 December 2019 в 10:48
поделиться
List<String> lines = System.IO.File.ReadAllLines(file).ToList()
lines.Contains("foo");
2
ответ дан 18 December 2019 в 10:48
поделиться

Вы можете просто зациклить строки следующим образом:

String line;
while ((line = file.ReadLine()) != null)
{
    if (line matches regex blah)
        return true;
}
return false;

Метод ReadLine загружает в память только одну строку файла, а не весь файл. Когда цикл запускается снова, единственная ссылка на эту строку теряется, и поэтому при необходимости эта строка будет собираться мусором.

1
ответ дан 18 December 2019 в 10:48
поделиться

Я хотел бы объединить пару методов, используемых здесь:

1). Установите FileSystemWatcher для файла. Установите необходимые фильтры для предотвращения ложных срабатываний. Вы не хотите проверять файл без необходимости.

2). Когда FSW вызывает событие, захватите содержимое, используя строку fileString = File.ReadAllLines ().

3). Используйте простое регулярное выражение, чтобы найти соответствие для вашей строки.

4). Если совпадение имеет индекс больше -1, то файл содержит строку с любым значением в индексе.

Вы успешно избежали необходимости разбирать файл построчно, у вас есть потенциально загружал большой объем данных (хотя 1600 строк текста вряд ли так много) в память. Когда строковый литерал выходит из области видимости, он '

0
ответ дан 18 December 2019 в 10:48
поделиться

Это действительно зависит от вашего определения «эффективный».

Если вы имеете в виду «эффективный для памяти», то вы можете использовать потоковый считыватель так, чтобы у вас была только одна строка текста в памяти на время, к сожалению, это медленнее, чем загрузка всего объекта сразу, и может заблокировать файл.

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

Если вы хотите просто выполнить наименьшее количество работы, есть ли что-нибудь, что вы уже знаете о файле? Как часто это будет обновляться? Первые 10 символов в каждой строке всегда одинаковы? Если вы смотрели 100 строк в прошлый раз, вам нужно повторно сканировать эти строки? Любое из них может создать огромную экономию как времени, так и использования памяти.

В конце концов, хотя волшебной палочки нет, и поиск файла - это (в худшем случае) операция O (n).


Извините, просто перечитайте это, и это может показаться саркастическим, и я не хочу, чтобы это было так. Я просто хотел подчеркнуть, что любые выгоды, которые вы получаете в одной области, скорее всего, будут потеряны в других местах, и термин «эффективный» - это весьма неоднозначный термин в подобных обстоятельствах.

2
ответ дан 18 December 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: