2017-02-07 3 views
0

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

Dim flatfiles As String() = IO.Directory.GetFiles("C:\DATA\TEST\", "*.txt").Where(Function(x) File.ReadAllText(x).Contains("Bob")).ToArray 
    For Each f As String In flatfiles 
     Dim contents As String = File.ReadAllText(f) 
     File.WriteAllText(f, contents.Replace("Bob", "Bill")) 
    Next 
+1

Возможно, используйте замену регулярного выражения, тогда его легко подсчитать и заменить, и ему может быть предложено заменить слова, только избегая * bobby * становится * billby *, см. [Количество регулярных выражений заменяет (C#)] (http://stackoverflow.com/questions/4994225/count-regex-replaces-c) –

+0

Я уверен, что эти файлы не большие, текущий подход прост и прост, но он работает. Вопрос в том, правильно ли он подходит? Загляните в *** Trie ***, способные хранить последовательность значений таким образом, чтобы трассировка пути от корня к любому узлу давала допустимое подмножество этой последовательности ... – Codexer

ответ

-1

Один (неэффективный) способ сделать это было бы включить счетчик за пределами For Each цикла (Dim itemsFound as Integer = 0), а затем увеличить его с помощью подсчета find в каждом файле, используя что-то вроде:

itemsFound = itemsFound + (Regex.Split(contents, find).Length - 1)

Regex.Split разделяет строку каждый раз, когда находит find, что означает, что счет, который вы ищете, меньше, чем количество элементов в списке.

Я бы сказал так, что вы звоните File.ReadAllText дважды в коде, так что вы можете улучшить его, чтобы избавиться от Where кода, и просто проверить в вашем For each цикле (видя, как вы теперь подсчет количество экземпляров в файле в любом случае, достаточно проверить наличие 0 вхождений). Кроме того, вы можете заменить код .Where, чтобы сохранить содержимое файла в массиве, а не имя файла (хотя это может быть опасно, если файлы большие); или вы даже можете сделать все это в Linq, если вам нужен какой-то запутанный код ...

+0

Я изучаю это сейчас и скоро вернется. Я бы не сказал, что это должно быть эффективным, просто работать. Спасибо за предложение, коснитесь его в ближайшее время .. –

+0

будет ли кто-нибудь вниз, пожалуйста, объясните, почему, поэтому я могу улучшить свой ответ? – simonalexander2005

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