Есть порядка 1млн файлов html, примерно по 30-40 кб.
Нужно искать в них строку, до 100 символов. При этом содержимое строки заранее неизвестно, содержимое файлов самое разное и на разных языках. Полнотекстовый индекс пробовали — много чего пропускает — подстроки не всегда слова + нужна поддержка большого количества языков. По времени поиска ограничены в 10 минут.
Посоветуйте пожалуйста направление поиска решения
задан 19 фев 2020 в 19:31
2
вы знаете… наверное правильнее написать простенькй индексатор(поисковик с индексированием типа ищем все слова, и пишем в базу в каких они фалах есть) в базу для ваших файлов и по нему уже производить поиск файла… это же ад какой-то грепать миллион файлов в несколько потоков
ответ дан 7 мая 2020 в 11:35
1
grep -r -P ".{1,100}" ./
В вопросе явно не указано, что нужно искать, только
до 100 символов
ответ дан 19 фев 2020 в 20:45
HellseherHellseher
3,61211 серебряных знаков32 бронзовых знака
2
1 править файлы плагина неправильно.
сложности с поддержкой такого кода — нужно помнить, что вы там меняли, следить, чтоб изменения не потерялись при обновлении, предупреждать об изменениях других программистов и тп.
2 как найти нужный кусок кода:
смотрим код страницы, как это место выводится на странице сайта,
копируем верстку (класс, id или строку),
ищем в коде по скопированному место, где оно генерируется.
может сразу не найтись, т.к. может генерироваться динамически.
тогда ищем по части строки/слова/id
например, в сгенерированном коде может быть так
div class=»post-1″
если искать по такой строке, ничего не найдет. тк в самом коде может быть что-то такое:
div class=»post-<?php echo $i; ?>»
поэтому, если ничего не нашло, нужно искать по меньшей части текста
Как найти нужный текст в большом количестве файлов?

Как вам логотип? Мне нравится 😉
Итак, для начала, скачиваем Notepad++ по ссылке. Затем запускаем скачавшийся файл и выбираем язык:
Нажимаем ОК и Далее, пока не увидим такую картину:
Тут нужно выбрать свой язык для дальнейшего удобного использования этой программы.
Снова Далее, Далее и программа установится!
Окно программы выглядит так:
Итак, чтобы найти что-то в конкретном открытом файле, нужно нажать всем известное Ctrl+F, а чтобы найти текст в файлах, нужно нажать Ctrl+Shift+F. Хотя, что это я тут пишу…я же видео-урок сделал! Смотрим:
[yframe url=’http://www.youtube.com/watch?v=X6qc3wIZK_0′]
Если будут какие-либо вопросы, пишите в комментариях!
Ваш Atamovich
how to
Уф сушилка для краски ультрафиолет для сушки краски tecsalab.ru.
Вам когда-нибудь приходилось находить текст в куче разных текстовых файлов? Если вы в ИТ, эта проблема может возникать довольно часто. Возможно, вы ищете конкретную фразу в лог-файлах или, может быть, вы программист, и вам нужно найти какой-то код, который находится внутри множества разных файлов кода.
К сожалению, в Windows нет простого способа сделать это. По умолчанию поиск Windows ужасен для такого рода задач, поскольку он очень медленный и не позволяет выполнять расширенный поиск. К счастью, есть несколько других способов, намного превосходящих поиск Windows, о которых я упомяну в этом посте. Я не буду вдаваться в подробности каждого решения, но вы можете использовать Google, чтобы узнать больше.
Если вы не хотите устанавливать какое-либо стороннее программное обеспечение и вам не безразлично использовать командную строку, вам следует ознакомиться с разделом о встроенных командах поиска ниже. Я предполагаю, что большинству людей более комфортно работать с интерфейсами GUI, поэтому я в первую очередь упоминаю программы.
Сторонние поисковые программы
Когда дело доходит до поиска нескольких текстовых файлов, король всех команд поиска — grep. grep — это утилита командной строки в UNIX / Linux, которая позволяет выполнять расширенный поиск с использованием регулярных выражений. Он очень популярен и используется во всех дистрибутивах Linux.
Поэтому, когда кто-то пишет программу для поиска в Windows, в нем неизбежно появляется слово grep. Это в значительной степени относится ко всем программам, перечисленным ниже.
grepWin
grepWin вероятно, самый популярный из инструментов, упомянутых здесь. Он поддерживает регулярные выражения и позволяет также найти и заменить текст. У них также есть учебник на их веб-сайте, чтобы помочь с регулярными выражениями, хотя вы можете Google для многих других.
Вы можете ограничить поиск по размеру файла, типу файла и другим критериям. Он также добавляет опцию в контекстное меню правой кнопкой мыши в Проводнике для быстрого поиска в папке. Результаты перечислены в нижнем окне, и вы можете просто дважды щелкнуть по ним, чтобы открыть файлы.
AstroGrep
AstroGrep это еще одна действительно хорошая поисковая программа. Он не только обновляется довольно часто, но и показывает, где в файле был найден текст. grepWin также имеет эту опцию, если вы выберете радиокнопку Content, но я думаю, что она реализована лучше в AstroGrep.
AstroGrep также может искать файлы Word, что очень удобно. Вы также можете сохранить или распечатать все результаты для дальнейшего использования. Я также нахожу их интерфейс более современным и приятным для глаз.
BareGrep
BareGrep это довольно простая поисковая программа, которая поддерживает регулярные выражения и все основные функции поиска. В целом он довольно быстрый и показывает совпадения в табличном формате. Бесплатная версия имеет заставку, которую вы не можете отключить. Профессиональная версия стоит $ 25 и, кажется, просто отключить заставку, в противном случае функции одинаковы.
PowerGREP
Если вы ищете конечную программу поиска, то ищите дальше, чем PowerGREP, У этой программы есть некоторые серьезные особенности и серьезный ценник, чтобы согласиться с этим. Это колоссальные 159 долларов! В нем почти все функции, упомянутые выше, плюс еще некоторые, и все они красиво упакованы в довольно маленький интерфейс.
Я рекомендую эту программу, только если у вас есть серьезные проблемы с поиском, которые включают поиск текста в файлах Word, PDF-документах, электронных таблицах Excel и т. Д. Она может даже извлекать статистику из ваших файлов журнала и предоставлять эту информацию вам. Это довольно мощный инструмент.
Встроенные команды Windows
Если вам нужно только выполнить быстрый поиск и не хотите устанавливать полноценную программу, вы можете использовать встроенные средства командной строки в Windows. Один запускается в обычной командной строке, а другой использует PowerShell. Оба довольно мощные и могут найти практически все, что вы ищете.
Первая команда — это findstr. Вы можете прочитать справочный документ здесь, чтобы узнать, как использовать findstr. Вы также можете ввести findstr /? в командной строке, и он покажет вам использование. Как видите, вариантов довольно много. Очевидно, что это намного сложнее, чем использование одной из программ выше.
Второй вариант — это команда Select-String в Windows PowerShell. Опять же, есть довольно большая кривая обучения с этими командами, если вы еще не использовали их. У Microsoft есть хороший учебник по как использовать Select-Stringтак что не забудьте прочитать это.
Таким образом, это в основном лучшие способы поиска текста в большом количестве файлов. Я предлагаю вам попробовать различные варианты и посмотреть, какой из них лучше всего подходит для вас. Наслаждайтесь!
Недавно мы решали следующую задачу – необходимо найти и удалить содержащие номера карт файлы, размещенные на общем ресурсе. Если нужно было бы искали что-то, определенное и однозначное, мы могли бы воспользоваться поиском в самой операционной системе (используя стандартны поиск текста в содержимом файла). Но, как правило, поиск стандартными средствами занимает очень много времени. А если еще нужно хотите использовать маски или регулярные выражения, то как быть? Поделимся, как мы решили эту задачу.
Инструменты
Данную задачу можно решить на многих языках взяв за основу идею, описанную в этой статье. Я буду делать реализацию на языке Python, а инструменты использовать «из коробки», без импорта сторонних библиотек. Почему я не использовал библиотеку Pandas? Pandas хороший инструмент для работы с файлами Excel, но он достаточно массивный и ресурсоемкий для решения нашей задачи.
Решение задачи
Углубимся в формат XLSX. Что он из себя представляет? Файл Excel — это обычный структурированный архив с расширением. XLSX. Если мы изменим расширение на. ZIP, то сможем открыть его с помощью архиватора, установленного в вашей операционной системе.
Давайте так и сделаем:
Файл Excel открылся в архиваторе, и мы видим структуру самого архива. Нам нужна папка [xl]. Проваливаемся в нее и видим:
Нам интересны директория [worksheets] и файл [sharedStrings.xml].
В файле [sharedString.xml] хранятся все текстовые поля, которые есть на листах в Excel, т.е. если поле текстовое, то оно будет хранится в этом файле, а ссылка на это поле будет находится в директории [worksheets] на соответствующем листе. Если в нескольких ячейках будет одно и тоже слово, то в файле будет одно слово, а в ячейках будет указана одна ссылка на это слово (см. рис.).
Итак, мы знаем, что номер карты является текстовым полем, соответственно он будет находится в этом файле. Приступим к написанию кода. Нам понадобятся следующие библиотеки: os – для работы с путями ОС, zipfile – для работы с архивами, re – для работы с регулярными выражениями — паттернами.
import os, zipfile, re #импортируем библиотеки
#Определяем регулярные выражения
pattern_card16=rb»(bd{16}b|bd{4}sd{4}sd{4}sd{4}b|bd{8}sd{8}b)»
pattern_card18=rb»(bd{18}b|bd{8}sd{10}b)»
Далее пишем функцию, которая будет сканировать выбранную нами директорию:
def find_file(dirn, path): # функция принимает os.listdir, и путь на папку
try:
for i in dirn:
if os.path.isfile(path+’/’+i): #проверяем что перед нами, файл или нет
#Проверяем расширение файла и исключаем системные которые начинаются на [~$]
if i.find(‘.xlsx’)!=-1and i.find(‘~$’)==-1 and i.find(‘.xlsx.’)==-1:
open_arch(path+’/’+i) #Функция по обработке архивов
else:
#Если это директория, то проваливаемся в нее
find_file(os.listdir(path+’/’+i),path+’/’+i)
except Exception as err:
print(err,path+’/’+i)
Теперь напишем саму функцию, которая будет обрабатывать найденные по условию файлы:
def open_arch(path_file):
z = zipfile.ZipFile(path_file, ‘r’) #открываем архив
files=z.namelist() #получаем список файлов в архиве
try:
for f in files:
if f==’xl/sharedStrings.xml’:
if re.search(pattern_card16, z.read(f))!=None or re.search(pattern_card18, z.read(f))!=None:
list_file.write(path_file+’n’) #Если находит совпадение, то пишем путь в файл
#print(re.findall(pattern_card16, z.read(r))) # если вам нужно
#print(re.findall(pattern_card18, z.read(r))) # выводить совпадения
except Exception as err:
print(err, files)
Определяем директорию для поиска и запускаем функцию для поиска:
path=’Y:’ #указываем путь к общему ресурсу, здесь я его подцепил как диск Y:
list_file=open(‘list_file’, ‘w+’) #открываем файл для записи
find_file(os.listdir(path), path) #запускаем обработку
Резюме
Наша работа сделана. Ждем, когда отработает скрипт и получим итоговый файл для анализа. Вы зададите вопрос, почему я сразу не стал удалять файлы? Потому что поиск основан на простом регулярном выражении и туда могут попасть номера заявок, договоров и т.д.
В результате нам удалось избежать ручного анализа более 154 тысяч файлов и сократить выборку более чем в 100 раз.
Я надеюсь, моя инструкция была полезна. Спасибо за внимание.



