Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск слов по маске (http://forum.oszone.net/showthread.php?t=343795)

ateka 24-01-2020 17:26 2906732

Поиск слов по маске
 
Увидел забавную картинку и задался вопросом.
Как в смд искать слова по маске?
Посмотреть картинку

Тут зашифровано слово ХИТРЕЦ.

Соответственно из текстового файла со списком всех русских слов
хочу по маске ?и???ц найти слово хитрец
Я так понял что нативные find и findstr так не умеют.
Какой программой под смд можно найти слова по маске?
Может grep умеет?

Iska 24-01-2020 18:13 2906746

Цитата:

Цитата ateka
Я так понял что нативные find и findstr так не умеют. »

findstr.exe умеет:
Код:

type "C:\Мои проекты\0296\0001.txt" | findstr.exe /i /r /c:"^[а-яё]и[а-яё][а-яё][а-яё]ц$"
Кодировка файла, естественно, должна быть в OEM/866.

Но лучше сие делать на WSH/PoSH, где есть полноценные (ну, или почти полноценные) регулярные выражения.

megaloman 24-01-2020 19:41 2906763

Паразитирую на решении Iska
Код:

@Echo Off
cls
        Set "Mask=?и???ц"
        Set "Vocabulary=Z:\Box_In\vocabulary.txt"

        findstr.exe /i /r /c:"^%Mask:?=[а-яё]%$" "%Vocabulary%"
pause
Exit /B

Сделал формирование регулярки по маске

DJ Mogarych 24-01-2020 22:32 2906780

Powershell:
Код:

$dict = gc C:\temp\slovar\zdf-win.txt
$dict -match "^\wи\w{3}ц$"
китаец
сириец
хитрец
чилиец
чистец

В словаре Лопатина ещё нашлись
дидоец
ливиец
лидиец
лионец
миасец
мидиец
пиреец
сиамец
сиенец
хищнец

yurfed 24-01-2020 23:03 2906788

DJ Mogarych, есть ещё одно - пИ..еЦ :)
ateka, я не знаю для чего вам это нужно, но есть программка для кроссвордов, которая делает всё тоже самое и даже больше. Cross+A. Имеет базу ~100000 слов с их описаниями.
Вот чо он выдал:
КИББУЦ (кибуц) кооперативное сельскохозяйственное предприятие в государстве Израиль
КИТАЕЦ (самоназвание - хань, ханьжэнь) представитель основного населения Китая
КИШНЕЦ (кориандр) растение семейства зонтичных (сельдерейных), медонос
ЛИВИЕЦ житель Ливии
ЛИВШИЦ российский актёр, создатель "Радионяни" совместно с Левенбуком; русский поэт, футурист (1886-1939)
ЛИДЕРЦ в венгерской мифологии злой дух, появляющийся на болотах в виде блуждающего огонька
ЛИПШИЦ французский художник, выходец из Литвы (1891-1973)
ЛИФШИЦ братья, российские физики-теоретики: (1915-1985) и (1916/17-82); российский литературовед (1905-1983)
СИАМЕЦ житель Сиама
СИРИЕЦ житель Сирии
ХИТРЕЦ хитрый человек
ХИЩНЕЦ насекомое, клоп
ЧИЛИЕЦ житель Чили
ЧИСТЕЦ медоносное травянистое растение семейства губоцветных

DJ Mogarych 24-01-2020 23:15 2906791

Это понятно, но таких слов в словари обычно не добавляют.
Цитата:

Цитата yurfed
программка для кроссвордов »

Цена: Условно-бесплатная, 1200 руб :gigi:
Лучше уж Пауэршеллом.
Тем более, что у моих словарей 169037 уникальных слов.
Код:

(gc C:\temp\slovar\zdf-win.txt,C:\temp\slovar\lop1v2.txt |sort -Unique).count
169037


ateka 24-01-2020 23:41 2906795

Iska,megaloman, Увы не ищет. Не уважает подстановки [а-яё].
Если они идут подряд то findstr их игнорирует.

DJ Mogarych, а можно ванлайнер? Я бы его в батник засунул.

Busla 24-01-2020 23:58 2906798

если в файле только русские слова, то вместо шаблона конкретных букв можно писать литерал произвольного символа - точку
Код:

findstr /i /r /c:"^.и...ц$" vocabulary.txt
Цитата:

Цитата ateka
можно ванлайнер? Я бы его в батник засунул. »

Код:

Select-String '^.и...ц$' vocabulary.txt -Encoding OEM | Select-Object -ExpandProperty Line
Цитата:

Цитата ateka
Увы не ищет. Не уважает подстановки [а-яё].
Если они идут подряд то findstr их игнорирует. »

видимо, вы где-то ошиблись

Iska 25-01-2020 00:29 2906802

Цитата:

Цитата ateka
Iska,megaloman, Увы не ищет. Не уважает подстановки [а-яё]. »

У меня — ищет

megaloman 25-01-2020 06:58 2906814

ateka,
Цитата:

Цитата ateka
Увы не ищет. Не уважает подстановки [а-яё]. »

либо у Вас батник не в 866 кодировке, либо словарь не в 866 кодировке, либо и то и другое вместе.

DJ Mogarych 25-01-2020 08:12 2906816

Цитата:

Цитата ateka
а можно ванлайнер? »

можно:
Код:

powershell -command "(gc C:\temp\slovar\zdf-win.txt) -match '^\wи\w{3}ц$'"

ateka 25-01-2020 11:52 2906840

Я потратил два часа на перебор всех вариантов и получил следующее.
В моей конфигурации ищет только если словарь в utf-8.
Возможно это из за включенной настройки:
Картинка

Я сохранял батники в 866. Конвертировал словари во всевозможные кодировки.
Но findstr на регулярку плевать хотела.
В любом случае проблема решена. Слава ПоШ!
Всем большое, большое спасибо.

Busla 25-01-2020 12:02 2906842

Цитата:

Цитата ateka
Возможно это из за включенной настройки: »

а зачем она такая?!

yurfed 25-01-2020 12:41 2906845

Цитата:

Цитата DJ Mogarych
Тем более, что у моих словарей 169037 уникальных слов. »

Если не жалко, скинь куда угодно или ссылку хоть сюда, хоть на любой обменник (только не через соцсети).
В своё время у самого были словари ~800000 словов. Только они "брутиловские" и в них много лишнего.
Цитата:

Цитата DJ Mogarych
Цена: Условно-бесплатная, 1200 руб »

А кто сказал что будет легко? :)

ateka 25-01-2020 15:12 2906878

Цитата:

Цитата Busla
а зачем она такая?! »

Ну например после включения этой настройки я наконец то смог связываться по API с одним русскоязычным сайтом.
Там нужен был json а он по определению юникод. И раньше приходилось гонять вм с линуксом.
Цитата:

Цитата yurfed
Если не жалко, скинь куда угодно или ссылку »

Я скачивал отсюда:
https://github.com/danakt/russian-words

megaloman 25-01-2020 17:17 2906900

Вложений: 1
ateka, Если надо ехать, а не шашечки, то проще пареной репы загрузить текстовый файл словаря (загружается нормально файл и с 866, и с 1251 и с UTF8 кодировкой), и использовать стандартное средство - фильтр. И не надо никаких иных приблуд. И интерфейс внятный и минимум затрат при вводе новой маски в поиск.
Прикрепляю Excel-файл с загруженным отсюда для примера словарем. Он был в UTF8.

ateka 25-01-2020 17:36 2906902

Цитата:

Цитата megaloman
Если надо ехать, а не шашечки »

Мне именно ехать :). Спасибо.

megaloman 25-01-2020 18:29 2906905

Вложений: 1
ateka,
Цитата:

Цитата ateka
Iska,megaloman, Увы не ищет. Не уважает подстановки [а-яё].
Если они идут подряд то findstr их игнорирует. »

Кстати, как доказательство, прикрепляю этот же словарь в 866 кодировке + мой батник в 866 кодировке, мой батник с findstr (фирма веников не вяжет!), как и (я уверен) батник Iska, работает. Попробуйте! Но если ехать, то Excel удобнее.
Цитата:

Цитата Busla
если в файле только русские слова, то вместо шаблона конкретных букв можно писать литерал произвольного символа - точку »

В этом случае мой батник упрощается и его можно записать в виде
Код:

@Echo Off
cls
        Set "Mask=.и...ц"
        Set "Vocabulary=vocabulary.txt"

        findstr.exe /i /r /c:"^%Mask%$" "%Vocabulary%"
pause
Exit /B


DJ Mogarych 25-01-2020 19:56 2906910

Цитата:

Цитата yurfed
Если не жалко, скинь куда угодно или ссылку хоть сюда, хоть на любой обменник »

http://www.speakrus.ru/dict/

Я скачал Зализняка и Лопатина, и для этой темы грузил их оба.

ateka 25-01-2020 21:00 2906917

Цитата:

Цитата megaloman
прикрепляю этот же словарь в 866 кодировке + мой батник в 866 кодировке, мой батник с findstr (фирма веников не вяжет!), как и (я уверен) батник Iska, работает. Попробуйте! »

Проверил. Не работает. Видимо мои локальные настройки shell не совместимы с кодировкой OEM-866.
Впрочем ничего страшного, есть PoSh, есть Эксель. Эксель для меня даже удобней.
Ещё раз спасибо за помощь.

Iska 25-01-2020 21:25 2906918

ateka, а запустите-ка интерпретатор команд "%comspec%" /k и выполните в нём команду chcp — что покажет?

ateka 26-01-2020 08:49 2906969

Iska, 65001
Но принудительная смена кодировки результата не даёт.
В 866 принципиально не ищет.

Iska 26-01-2020 10:52 2906980

Цитата:

Цитата ateka
Iska, 65001 »

:).

Цитата:

Цитата ateka
Но принудительная смена кодировки »

Как это выглядит — «принудительная смена кодировки»?

ateka 26-01-2020 11:37 2906985

Код:

chcp 866
type russian_866.txt | findstr.exe /i /r /c:"^[а-яё]и[а-яё][а-яё][а-яё]ц$"

Не ищет.

Iska 26-01-2020 13:01 2906992

ateka, при этом кодировка самого пакетного файла также OEM/866?

megaloman 26-01-2020 13:46 2906995

Вложений: 1
ateka,
Цитата:

Цитата Iska
ateka, при этом кодировка самого пакетного файла также OEM/866? »

Распакуйте мой архив из предыдущего поста со словарем и батником, возьмите прикреплённый файл в этом посте, поместите его рядом с распакованным vocabulary.txt, переименуйте его из txt в bat, ничего больше не изменяйте. Запустите именно его. И?

ateka 26-01-2020 15:52 2907008

Цитата:

Цитата Iska
при этом кодировка самого пакетного файла также OEM/866? »

Ага.
Цитата:

Цитата megaloman
Запустите именно его. И? »

Не ищет. Даже русские буквы в 866 не отображает.
Картинка

alpap 27-01-2020 12:20 2907096

ateka, неее ...
вы сделайте такой скриншот
Файл 160204

ateka 27-01-2020 14:28 2907114

alpap, Батники в 866. Гарантированно. Оболочка по умолчанию в 65001. Никак 2020 на дворе.

megaloman 27-01-2020 19:03 2907203

Вложений: 1
ateka,
Попробуйте VBS.
Код:

'FileIn = "D:\CMD_Forum\Box_In\vocabularyUTF8.txt"
FileIn = "vocabularyUTF8.txt"

nword = 3

On Error Resume Next

With CreateObject("ADODB.Stream")
    .Charset = "utf-8"
    .Open
    .LoadFromFile (FileIn)
    If Err.Number <> 0 Then
        MsgBox "File  " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")"
        WScript.Quit 2
    End If
    On Error GoTo 0
   
    Alls = Split(.ReadText(), vbCrLf)
    .Close
End With
On Error GoTo 0

With CreateObject("VBScript.RegExp")
    .IgnoreCase = True
    .Global = True
    Mask = ""
    Do
        Mask = InputBox("Маска содержит русские буквы и точки, например" + vbCrLf + ".и...ц", "Поиск слов по маске", Mask)
        If Mask = "" Then Exit Do
        .Pattern = "^" + Trim(Mask) + "$"
       
        out = ""
        i = 0
        For Each word In Alls
            word = Trim(word)
            If .Test(word) Then
                If i = 0 Then out = out + word Else out = out + vbTab + word
                i = i + 1
                If i = 3 Then
                    i = 0
                    out = out + vbCrLf
                End If
            End If
        Next
        If out = "" Then
            R = MsgBox("По маске    " + """" + Mask + """" + vbCrLf + "Ничего не найдено", vbRetryCancel)
        Else
            R = MsgBox(out, vbRetryCancel, "Маска " + """^" + Trim(Mask) + "$"". Найдено:")
        End If
        If R = 2 Then Exit Do
    Loop

End With

Интересно, сработает? Скрипт сохранить в 1251-кодировке. Словарь - в UTF-8. Прилагаю и то и другое в архиве
А вообще-то нестандартные настройки рано или поздно выходят боком

ateka 01-02-2020 09:39 2907845

Цитата:

Цитата megaloman
Попробуйте VBS »

Гуи отображается плохо
Картинко

Ищет хорошо но обнаружилась проблема.
Когда я ему подсунул словарь побольше скрипт без признаков жизни по 10 минут думал
а потом только показывал гуи. В общем если ещё раз возникнет нужда искать по маске
буду использовать ПоШ. Ну или МС адаптирует findstr для utf8.

Iska 01-02-2020 12:04 2907853

Цитата:

Цитата ateka
Гуи отображается плохо »

Cкрипт WSH должен быть в кодировке ANSI/1251:
Цитата:

Цитата megaloman
Скрипт сохранить в 1251-кодировке. Словарь - в UTF-8. Прилагаю и то и другое в архиве »

Цитата:

Цитата ateka
Когда я ему подсунул словарь побольше скрипт без признаков жизни по 10 минут думал »

WSH не работает напрямую с UTF-8, приходится перекодировать. И, как и любые множественные операции над строками, это может занимать заметное время.

megaloman 01-02-2020 12:49 2907858

Iska, что-то надо в консерватории поменять, и скрипт и словарь я отдавал в архиве в нужной кодировке, а на экране сплошная непристойность. Есть паллиатив - сделать сообщения на английском, но, при русском словаре это не фэншуйно.
ateka, а побольше - это сколько?

Iska 01-02-2020 14:01 2907869

Цитата:

Цитата megaloman
я отдавал в архиве в нужной кодировке, »

У меня-то как раз с Вашим архивом из #30 всё нормально:



Цитата:

Цитата megaloman
ateka, а побольше - это сколько? »

Полгига-гиг?!

ateka 01-02-2020 14:33 2907874

Цитата:

Цитата megaloman
надо в консерватории поменять, и скрипт и словарь я отдавал в архиве в нужной кодировке »

Я ничего не менял.
Цитата:

Цитата megaloman
побольше - это сколько? »

Очень большой. Там со всеми склонениями ~1.500.000 строк.
Просто в нём встречаются редкие слова. 35мб.

Iska 01-02-2020 15:48 2907882

ateka, упакуйте его в архив и выложите на облако.

ateka 01-02-2020 18:54 2907912

Цитата:

Цитата Iska
упакуйте его в архив и выложите на облако »

Я качал отсюда: https://github.com/danakt/russian-words
Конвертировал
Код:

iconv.exe -f cp1251 -t UTF-8 russian.txt >.\Result\UTF-8.txt
Файл: https://femto.pw/4tzb.rar

Iska 01-02-2020 19:16 2907914

ateka, а зачем Вы вообще конвертировали файл, который изначально шёл в ANSI/1251?! Не конвертируйте. И попросите коллегу megaloman убрать конвертацию ANSI→UTF8 из кода.

Ну, и:
Цитата:

Цитата ateka
Когда я ему подсунул словарь побольше скрипт без признаков жизни по 10 минут думал а потом только показывал гуи. »

— не подтверждаю. Задержка с появлением окна запроса маски, связанная с конвертацией файла словаря обратно в ANSI, у меня занимает примерно полминуты.

ateka 01-02-2020 19:55 2907924

Цитата:

Цитата Iska
И попросите коллегу megaloman убрать конвертацию ANSI→UTF8 из кода. »

Большое спасибо но поверьте не стоит тратить время. ПоверШелл меня вполне устраивает.
Кстати и решение с экселем было отличным. Эксель самый быстрый и удобный.
Цитата:

Цитата Iska
у меня занимает примерно полминуты »

Тут не знаю. У меня интель, 8гб памяти и быстрый ссд. Антивирус дефолт.
Но ждать приходиться больше десяти минут. Данная технология на моей машинке ленится.

Цитата:

Цитата Iska
зачем Вы вообще конвертировали файл, который изначально шёл в ANSI/1251?! »

Потому что fndstr на моей машинке ищет только по файлам с кодировкой UTF8.
Как я уже указывал я менял системные настройки на UTF8 суппорт.

megaloman 01-02-2020 20:00 2907928

Вложений: 1
Цитата:

Цитата Iska
И попросите коллегу megaloman убрать конвертацию ANSI→UTF8 из кода. »

Не надо просить!!! Уже сделал
Код:

FileIn = "Z:\Soft_Arc\Словарь\1251.txt"

nword = 3

On Error Resume Next

Set FSO = CreateObject("Scripting.FileSystemObject")

On Error Resume Next

With FSO.OpenTextFile(FileIn, 1, False)
    If Err.Number <> 0 Then
        MsgBox "File  " + FileIn + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")"
        WScript.Quit 2
    End If
    On Error GoTo 0

    Alls = Split(.ReadAll, vbCrLf)
    .Close
End With
On Error GoTo 0

With CreateObject("VBScript.RegExp")
    .IgnoreCase = True
    .Global = True
    Mask = ""
    Do
        Mask = InputBox("Маска содержит русские буквы и точки, например" + vbCrLf + ".и...ц", "Поиск слов по маске", Mask)
        If Mask = "" Then Exit Do
        .Pattern = "^" + Trim(Mask) + "$"
       
        out = ""
        i = 0
        For Each word In Alls
            word = Trim(word)
            If .Test(word) Then
                If i = 0 Then out = out + word Else out = out + vbTab + word
                i = i + 1
                If i = 3 Then
                    i = 0
                    out = out + vbCrLf
                End If
            End If
        Next
        If out = "" Then
            R = MsgBox("По маске    " + """" + Mask + """" + vbCrLf + "Ничего не найдено", vbRetryCancel)
        Else
            R = MsgBox(out, vbRetryCancel, "Маска " + """^" + Trim(Mask) + "$"". Найдено:")
        End If
        If R = 2 Then Exit Do
    Loop

End With

Словарь, скрипт 1251. На моём десятилетнем ноуте загрузка словаря занимает ~30сек, поиск ~15. Но с Вашими проблемами с кодировками не уверен, что у Вас получится - проблемы в консерватории.
Кстати, findstr и словарь в 866 кодировке работает в 3 раза быстрее.
Мой Excel это кол-во строк не съел. Не знаю, может в настройках можно нашаманить.

Iska 01-02-2020 20:03 2907929

Цитата:

Цитата ateka
Тут не знаю. У меня интель, 8гб памяти и быстрый ссд. Антивирус дефолт.
Но ждать приходиться больше десяти минут. Данная технология на моей машинке ленится. »

Тоже не знаю. У меня нет SSD — и загрузка с обратной конвертацией ~ 30 секунд.

Цитата:

Цитата ateka
Потому что fndstr на моей машинке ищет только по файлам с кодировкой UTF8.
Как я уже указывал я менял системные настройки на UTF8 суппорт. »

Это для интерпретатора команд. Для WSH зачем было менять-то?

ateka 01-02-2020 20:38 2907935

Цитата:

Цитата Iska
Это для интерпретатора команд. Для WSH зачем было менять-то? »


А я менял здесь
картинка

Это для всех систем видимо. На самом деле я доволен. Ещё пару обновлений и сделают как надо.
Я на винде с доса и на десятку молюсь. Так или иначе все проблемы решаемы.

megaloman 01-02-2020 20:58 2907938

Цитата:

Цитата ateka
Так или иначе все проблемы решаемы. »

А если проблем нет, надо их себе насоздавать :)
Цитата:

Цитата ateka
Я на винде с доса и на десятку молюсь. »

В смысле? До десятки ничего не было? Может, не стОит отвёрткой лезть в микросхему?

Iska 02-02-2020 13:16 2907993

Цитата:

Цитата ateka
А я менял здесь »

Я про кодировку словаря.


Время: 21:26.

Время: 21:26.
© OSzone.net 2001-