Войти

Показать полную графическую версию : [решено] Поиск слов по маске


Страниц : 1 [2] 3

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

ateka
26-01-2020, 08:49
Iska, 65001
Но принудительная смена кодировки результата не даёт.
В 866 принципиально не ищет.

Iska
26-01-2020, 10:52
Iska, 65001 »
:).

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

ateka
26-01-2020, 11:37
chcp 866
type russian_866.txt | findstr.exe /i /r /c:"^[а-яё]и[а-яё][а-яё][а-яё]ц$"
Не ищет.

Iska
26-01-2020, 13:01
ateka, при этом кодировка самого пакетного файла также OEM/866?

megaloman
26-01-2020, 13:46
ateka, ateka, при этом кодировка самого пакетного файла также OEM/866? »
Распакуйте мой архив из предыдущего поста (http://forum.oszone.net/attachment.php?attachmentid=160196&d=1579966169) со словарем и батником, возьмите прикреплённый файл в этом посте, поместите его рядом с распакованным vocabulary.txt, переименуйте его из txt в bat, ничего больше не изменяйте. Запустите именно его. И?

ateka
26-01-2020, 15:52
при этом кодировка самого пакетного файла также OEM/866? »
Ага.
Запустите именно его. И? »
Не ищет. Даже русские буквы в 866 не отображает.
https://i.imgur.com/HRsqGRZ.png

alpap
27-01-2020, 12:20
ateka, неее ...
вы сделайте такой скриншот
160204

ateka
27-01-2020, 14:28
alpap, Батники в 866. Гарантированно. Оболочка по умолчанию в 65001. Никак 2020 на дворе.

megaloman
27-01-2020, 19:03
ateka, '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
Попробуйте VBS »
Гуи отображается плохо
https://i.imgur.com/vJrSZdv.png
Ищет хорошо но обнаружилась проблема.
Когда я ему подсунул словарь побольше скрипт без признаков жизни по 10 минут думал
а потом только показывал гуи. В общем если ещё раз возникнет нужда искать по маске
буду использовать ПоШ. Ну или МС адаптирует findstr для utf8.

Iska
01-02-2020, 12:04
Гуи отображается плохо »
Cкрипт WSH должен быть в кодировке ANSI/1251:
Скрипт сохранить в 1251-кодировке. Словарь - в UTF-8. Прилагаю и то и другое в архиве »

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

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

Iska
01-02-2020, 14:01
я отдавал в архиве в нужной кодировке, »
У меня-то как раз с Вашим архивом из #30 (http://forum.oszone.net/post-2907203-30.html) всё нормально:

https://i.imgur.com/qMPM9F0.png

ateka, а побольше - это сколько? »
Полгига-гиг?!

ateka
01-02-2020, 14:33
надо в консерватории поменять, и скрипт и словарь я отдавал в архиве в нужной кодировке »
Я ничего не менял.
побольше - это сколько? »
Очень большой. Там со всеми склонениями ~1.500.000 строк.
Просто в нём встречаются редкие слова. 35мб.

Iska
01-02-2020, 15:48
ateka, упакуйте его в архив и выложите на облако.

ateka
01-02-2020, 18:54
упакуйте его в архив и выложите на облако »
Я качал отсюда: 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
ateka, а зачем Вы вообще конвертировали файл, который изначально шёл в ANSI/1251?! Не конвертируйте. И попросите коллегу megaloman убрать конвертацию ANSI→UTF8 из кода.

Ну, и:
Когда я ему подсунул словарь побольше скрипт без признаков жизни по 10 минут думал а потом только показывал гуи. »
— не подтверждаю. Задержка с появлением окна запроса маски, связанная с конвертацией файла словаря обратно в ANSI, у меня занимает примерно полминуты.

ateka
01-02-2020, 19:55
И попросите коллегу megaloman убрать конвертацию ANSI→UTF8 из кода. »
Большое спасибо но поверьте не стоит тратить время. ПоверШелл меня вполне устраивает.
Кстати и решение с экселем было отличным. Эксель самый быстрый и удобный.
у меня занимает примерно полминуты »
Тут не знаю. У меня интель, 8гб памяти и быстрый ссд. Антивирус дефолт.
Но ждать приходиться больше десяти минут. Данная технология на моей машинке ленится.

зачем Вы вообще конвертировали файл, который изначально шёл в ANSI/1251?! »
Потому что fndstr на моей машинке ищет только по файлам с кодировкой UTF8.
Как я уже указывал я менял системные настройки на UTF8 суппорт.

megaloman
01-02-2020, 20:00
И попросите коллегу 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 это кол-во строк не съел. Не знаю, может в настройках можно нашаманить.




© OSzone.net 2001-2012