Что нового

Найти слова в тексте

lemonia

Новичок
Сообщения
126
Репутация
0
Версия AutoIt: 3.3.14.5

Описание: Надо проверять файлы с отсканированным кодом в пакетном режиме. Надо найти такие слова, в которых смешаны русские и английские буквы, похожие внешне. Чтобы в операторах программирования не попали русские буквы. Как это можно сделать?

Пока что можно и не в пакетном режиме, если у Вас квалификации для этого не хватает.

Примечания: Windows XP
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
Чтобы в операторах программирования не попали русские буквы. Как это можно сделать?
Если я правильно понял, то нужно русские АВС и т.д. заменить на англ. ABC, правильно ли я понял?
И еще какого размера файлы, маленькие или свыше нескольких сот мегабайт?
И имеет ли смысл регистр букв или можно заглавные заменить на строчные?
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Может быть и так, только пока что такой вариант (автоматическая замена) не хочу использовать, он кажется опасным. Хочется найти и посмотреть сначала перед правкой. Файлы маленькие. Также в русских словах тоже нужно искать английские буквы (в принципе можно и без этого, однако на всякий случай, если это возможно и легко, то предусмотреть в программе реверс). А так то да, заменить нужно русские АВС и т.д. на англ. ABC.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Пока так, будет время еще помогу, если вопрос не решится.
Код:
$sText = 'QqWwEeRrTtYyUuIiOoPpAaSsDdFfGgHhJjKkLlZzXxCcVvBbNnMm ЁёЙйЦцУуКкЕеНнГгШшЩщЗзХхЪъФфЫыВвАаПпРрОоЛлДдЖжЭэЯяЧчСсМмИиТтЬьБбЮю'


;в эту строку можно добавить свои пары символов (ЮZжF) которые нужно заменить
;где ПЕРВЫЙ символ будет заменен на ВТОРОЙ ТРЕТИЙ на ЧЕТВЕРТЫЙ и т.д.
;пары можно не разделять или разделять любыми не буквенными символами
$sChars = 'ЕE еe гr ТT уy иu ОO оo РP рp КK кk НH дg аa АA хx ХX сc СC ьb ВB пn тm МM'

;заменяет символы из пар в переменной $sChars
ReplaceCyrillic_($sText, $sChars)
;удаляет оставшиеся буквы кирилицы
RemoveCyrillic_($sText)

ConsoleWrite($sText&@CRLF)








;заменяет символы из пар
Func ReplaceCyrillic_(ByRef $_sText, ByRef $_sChars)
	Local Static $_aChars = CharsSplitPairs_($_sChars)
	Local $_iA, $_sReplaceable, $_sReplacing
	For $_iA = 1 To $_aChars[0]
		$_sReplaceable = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$1')
		$_sReplacing = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$2')
		$_sText = StringRegExpReplace($_sText, $_sReplaceable, $_sReplacing)
	Next
EndFunc

;удаляет все буквы кирилицы
Func RemoveCyrillic_(ByRef $_sText)
	$_sText = StringRegExpReplace($_sText, '[А-Яа-яЁё]', '')
EndFunc

;ФУНКЦИЯ РАЗБИВАЕТ СТРОКУ НА МАСИВ, СОДЕРЖАЩИЙ В СЕБЕ ПАРЫ СИМВОЛОВ
;----------------------------------------------------------------------------------------------
;Например строка
;$_sChars = EЕrгTТ
;примет вид масива:
;$Array[0] = EЕ
;$Array[1] = rг
;$Array[2] = TТ
;----------------
;При параметре $_iLen = 0
;масив будет иметь вид как выше
;а при $_iLen = 1
;$Array[0] = 3
;$Array[1] = rг
;$Array[2] = TТ
;$Array[3] = EЕ
;где $Array[0] = 3 это кол-во элементов в масиве
Func CharsSplitPairs_($_sChars, $_iLen = 1)
	Local $_sPairs = StringRegExp($_sChars, '[A-Za-zА-Яа-яЁё]{2}', 3)
	If @error Then
		Return SetError(1)
	EndIf
	If $_iLen Then
		$_iLen = UBound($_sPairs)
		ReDim $_sPairs[$_iLen +1]
		$_sPairs[$_iLen] = $_sPairs[0]
		$_sPairs[0] = $_iLen
	EndIf
	Return $_sPairs
EndFunc
И еще я чуть запутался, говорите в русских словах тоже нужно искать англ. буквы.
Но как понять русское слово или английское.
Мой недо-пример выше не учитывает русские или английские слова, он просто все русские буквы или заменяет или удаляет.


Добавлено:
Сообщение автоматически объединено:

Если такой вариант устраивает, потом можно продолжить и организовать рекурсию.
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
говорите в русских словах тоже нужно искать англ. буквы.
Ой, это немного я ступил. Надо найти слова, в которых одновременно и русские и английские буквы. То есть это то же самое искать будет сразу.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
только пока что такой вариант (автоматическая замена) не хочу использовать, он кажется опасным.
Данный пример вытаскивает из текста все слова содержащие русские буквы.
Код:
$sText = 'Eng1 Rus1 Инг1 Рус1 Eпg2 Rиs2 ИHг2 Pyc2'

$aArray = StringRegExp($sText, '(?i)([^\h]*[А-Яа-яЁё][^\h]*)', 3)
If Not @error Then
	For $iA = 0 To UBound($aArray) -1
		ConsoleWrite($aArray[$iA]&@CRLF)
	Next
	Exit
EndIf
Первый пример от меня может только перезаписывать русские буквы, плюс если нужно удалить оставшиеся или все русские буквы, плюс можно легко настроить какую русскую букву на какую английскую заменить, не думаю что он опасен.
Только если в ваших файлах есть комментарии или нужные слова на русском, тогда с ними беда, Здесь уже нужно будет разбирать структуру отсканированного кода.


Добавлено:
Сообщение автоматически объединено:

И еще, так для справки, мало ли. Символ "№" кажется тоже относится к кирилице.
Сканер может заменить NO на .
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Благодарю. А как пользоваться вашей программой, надо запустить её в папке с файлами? Как узнаю, что она выполнила какую то работу? Как вариант, могу скопировать файлы в виде копии в другое место и после работы программы она выведет лог, в каком файле, в какой строке что заменила. Если все устраивает, то поменяю файл в исходной папке, откуда брал до обработки. В коде есть много русских слов. Для того, чтобы операторы искать неправильные, эта программа нужна, а чисто русские и английские слова трогать не надо.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
А как пользоваться вашей программой
Пока это скажем наброски кода, готовое решение попозже выложу.
Пока пытаюсь оптимизировать как вы говорите чтобы русские слова не съедало.
Потом допишу рекурсию для обработки файлов пакетно.
Короче если успею сегодня выложу.
 
Автор
L

lemonia

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

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Если еще интересно, вот код
Код:
;в эту строку можно добавить свои пары символов (ЮZжF) которые нужно заменить
;где ПЕРВЫЙ символ будет заменен на ВТОРОЙ ТРЕТИЙ на ЧЕТВЕРТЫЙ и т.д.
;пары можно не разделять или разделять любыми не буквенными символами
$sChars = 'ЕE еe гr ТT уy иu ОO оo РP рp КK кk НH дg аa АA хx ХX сc СC ьb ВB пn тm МM з3 З3 ч4 Ч4 шw ШW щw ЩW'

;здесь указываете путь к папке где лежат файлы которые нужно обработать
$sFoderIn = @ScriptDir& '\Новая папка'
;это путь к папке куда ложить измененные файлы и логи работы
$sFoderOut = @ScriptDir& '\ReplaceCyrillic'

Recursion_($sFoderIn)

Func Recursion_($_sFoder)
	Local $sWordsRusCyrillic, $sWordsChanged, $_sText, $_sWord, $_aAllWords, $_iA, $_iLog, $_sNewFile
	Local $_hList=FileFindFirstFile($_sFoder& '\*.*')
	While 1
		$_sFile=FileFindNextFile($_hList)
		If @error Then
			ExitLoop
		EndIf
		If @extended Then
			Recursion_($_sFoder& '\'& $_sFile)
		ElseIf $_sFile <> @ScriptName Then
			$_iLog = 0
			$_sWordsRusCyrillic = ''
			$_sWordsChanged = ''
			$_sText = FileRead($_sFoder& '\'& $_sFile)
			$_aAllWords = StringRegExp($_sText, '(?i)([A-Za-zА-Яа-яЁё]+).?', 3)
			If Not @error Then
				For $_iA = 0 To UBound($_aAllWords) -1
					If Not WordIsEng_($_aAllWords[$_iA]) Then
						If Not WordIsRus_($_aAllWords[$_iA]) Then
							$_iLog = 1
							$_sWord = ReplaceCyrillic_($_aAllWords[$_iA])
							If WordIsEng_($_sWord) Then
								$_sText = StringReplace($_sText, $_aAllWords[$_iA], $_sWord)
								$_sWordsChanged &= $_aAllWords[$_iA]& ' > '& $_sWord& @CRLF
							Else
								$_sWordsRusCyrillic &= $_aAllWords[$_iA]& @CRLF
							EndIf
						EndIf
					EndIf
				Next
				If $_iLog Then
					$_sNewFile = StringReplace($_sFoder, $sFoderIn, $sFoderOut)
					DirCreate($_sNewFile)
					$_sNewFile &= '\'& $_sFile
					FileWrite($_sNewFile, $_sText)
					If $_sWordsChanged <> '' Then
						FileWrite($_sNewFile& '.log', 'Слова которые были заменены (Оригинал > Замена):'& @CRLF& @CRLF)
						FileWrite($_sNewFile& '.log', $_sWordsChanged& @CRLF& @CRLF)
					EndIf
					If $_sWordsRusCyrillic <> '' Then
						FileWrite($_sNewFile& '.log', 'Слова которые все еще содержат русские буквы:'& @CRLF& @CRLF)
						FileWrite($_sNewFile& '.log', $_sWordsRusCyrillic& @CRLF& @CRLF)
						FileWrite($_sNewFile& '.log', 'Для их замены в дальнейшем нужно в скрипте в переменной $sChars добавить какую букву на какую заменить.'& @CRLF)
					EndIf
				EndIf
			EndIf
		EndIf
	WEnd
EndFunc

Func WordIsEng_($_sWord)
	StringRegExpReplace($_sWord, '[А-Яа-яЁё]', '')
	Return (@extended = 0)
EndFunc

Func WordIsRus_($_sWord)
	StringRegExpReplace($_sWord, '[^А-Яа-яЁё]', '')
	Return (@extended = 0)
EndFunc

Func ReplaceCyrillic_($_sText)
    Local Static $_aChars = CharsSplitPairs_($sChars)
    Local $_iA, $_sReplaceable, $_sReplacing
	For $_iA = 1 To $_aChars[0]
        $_sReplaceable = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$1')
        $_sReplacing = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$2')
        $_sText = StringRegExpReplace($_sText, $_sReplaceable, $_sReplacing)
    Next
	Return $_sText
EndFunc

;ФУНКЦИЯ РАЗБИВАЕТ СТРОКУ НА МАСИВ, СОДЕРЖАЩИЙ В СЕБЕ ПАРЫ СИМВОЛОВ
;----------------------------------------------------------------------------------------------
;Например строка
;$_sChars = EЕrгTТ
;примет вид масива:
;$Array[0] = EЕ
;$Array[1] = rг
;$Array[2] = TТ
;----------------
;При параметре $_iLen = 0
;масив будет иметь вид как выше
;а при $_iLen = 1
;$Array[0] = 3
;$Array[1] = rг
;$Array[2] = TТ
;$Array[3] = EЕ
;где $Array[0] = 3 это кол-во элементов в масиве
Func CharsSplitPairs_($_sChars, $_iLen = 1)
    Local $_sPairs = StringRegExp($_sChars, '[A-Za-zА-Яа-яЁё]{2}', 3)
    If @error Then
        Return SetError(1)
    EndIf
    If $_iLen Then
        $_iLen = UBound($_sPairs)
        ReDim $_sPairs[$_iLen +1]
        $_sPairs[$_iLen] = $_sPairs[0]
        $_sPairs[0] = $_iLen
    EndIf
    Return $_sPairs
EndFunc
Скрипт обрабатывает только слова содержащие только буквы и не единого другого символа или цифры

Имейте ввиду что следующие совпадения не учитываются скриптом
буквы NO или No могут быть
цифра 0 может быть русской буквой О или о
цифра 3 может быть русской буквой З или з
цифра 4 может быть русской буквой Ч или ч
так же могут быть и другие не обрабатываемые совпадения, ведь отсканированый текст не предсказуем, работал со сканером и видел результат.

Лог замены создается для каждого измененого файла с таким же именем как и файл + .log
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Благодарю. Не пойму, как правильно прописать путь к директории C:\Documents and Settings\DELL\My Documents\123
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
Благодарю. Не пойму, как правильно прописать путь к директории C:\Documents and Settings\DELL\My Documents\123
Код:
$sFoderIn = 'C:\Documents and Settings\DELL\My Documents\123'

или
Код:
$sFoderOut = 'C:\Documents and Settings\DELL\My Documents\123'
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Благодарю. Реально помогает вот на такой комбинации в нескольких файлах нашлось. А там ещё по много раз это встречается.
Код:
Слова которые были заменены (Оригинал > Замена):
TО > TO
А можно ещё добавить счётчик, чтобы писало, сколько раз определенное сочетание букв было заменено в определенном файле? Так как это интересно.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
А можно ещё добавить счётчик, чтобы писало, сколько раз определенное сочетание букв было заменено в определенном файле? Так как это интересно.
Код:
;в эту строку можно добавить свои пары символов (ЮZжF) которые нужно заменить
;где ПЕРВЫЙ символ будет заменен на ВТОРОЙ ТРЕТИЙ на ЧЕТВЕРТЫЙ и т.д.
;пары можно не разделять или разделять любыми не буквенными символами
$sChars = 'ЕE еe гr ТT уy иu ОO оo РP рp КK кk НH дg аa АA хx ХX сc СC ьb ВB пn тm МM з3 З3 ч4 Ч4 шw ШW щw ЩW'

;здесь указываете путь к папке где лежат файлы которые нужно обработать
$sFoderIn = @ScriptDir& '\Новая папка'
;это путь к папке куда ложить измененные файлы и логи работы
$sFoderOut = @ScriptDir& '\ReplaceCyrillic'

Recursion_($sFoderIn)

Func Recursion_($_sFoder)
    Local $sWordsRusCyrillic, $sWordsChanged, $_sText, $_sWord, $_aAllWords, $_iA, $_iLog, $_sNewFile, $_sAllWorlds ='|', $_iCounter
    Local $_hList=FileFindFirstFile($_sFoder& '\*.*')
    While 1
        $_sFile=FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            Recursion_($_sFoder& '\'& $_sFile)
        ElseIf $_sFile <> @ScriptName Then
            $_iLog = 0
            $_sWordsRusCyrillic = ''
            $_sWordsChanged = ''
            $_sText = FileRead($_sFoder& '\'& $_sFile)
            $_aAllWords = StringRegExp($_sText, '(?i)([A-Za-zА-Яа-яЁё]+).?', 3)
            If Not @error Then
                For $_iA = 0 To UBound($_aAllWords) -1
                    If Not StringInStr($_sAllWorlds, '|'& $_aAllWords[$_iA]& '|') Then
						If Not WordIsEng_($_aAllWords[$_iA]) Then
							If Not WordIsRus_($_aAllWords[$_iA]) Then
								$_iLog = 1
								$_sWord = ReplaceCyrillic_($_aAllWords[$_iA])
								If WordIsEng_($_sWord) Then
									$_sText = StringReplace($_sText, $_aAllWords[$_iA], $_sWord)
									$_iCounter = @extended
									$_sWordsChanged &= $_aAllWords[$_iA]& ' > '& $_sWord& ' < ['& $_iCounter& ']'& @CRLF
								Else
									$_sWordsRusCyrillic &= $_aAllWords[$_iA]& @CRLF
								EndIf
							EndIf
						EndIf
						$_sAllWorlds &= $_aAllWords[$_iA]& '|'
					EndIf
                Next
                If $_iLog Then
                    $_sNewFile = StringReplace($_sFoder, $sFoderIn, $sFoderOut)
                    DirCreate($_sNewFile)
                    $_sNewFile &= '\'& $_sFile
                    FileWrite($_sNewFile, $_sText)
                    If $_sWordsChanged <> '' Then
                        FileWrite($_sNewFile& '.log', 'Слова которые были заменены (Оригинал > Замена < [Кол-во замен]):'& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', $_sWordsChanged& @CRLF& @CRLF)
                    EndIf
                    If $_sWordsRusCyrillic <> '' Then
                        FileWrite($_sNewFile& '.log', 'Слова которые все еще содержат русские буквы:'& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', $_sWordsRusCyrillic& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', 'Для их замены в дальнейшем нужно в скрипте в переменной $sChars добавить какую букву на какую заменить.'& @CRLF)
                    EndIf
                EndIf
            EndIf
        EndIf
    WEnd
EndFunc

Func WordIsEng_($_sWord)
    StringRegExpReplace($_sWord, '[А-Яа-яЁё]', '')
    Return (@extended = 0)
EndFunc

Func WordIsRus_($_sWord)
    StringRegExpReplace($_sWord, '[^А-Яа-яЁё]', '')
    Return (@extended = 0)
EndFunc

Func ReplaceCyrillic_($_sText)
    Local Static $_aChars = CharsSplitPairs_($sChars)
    Local $_iA, $_sReplaceable, $_sReplacing
    For $_iA = 1 To $_aChars[0]
        $_sReplaceable = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$1')
        $_sReplacing = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$2')
        $_sText = StringRegExpReplace($_sText, $_sReplaceable, $_sReplacing)
    Next
    Return $_sText
EndFunc

;ФУНКЦИЯ РАЗБИВАЕТ СТРОКУ НА МАСИВ, СОДЕРЖАЩИЙ В СЕБЕ ПАРЫ СИМВОЛОВ
;----------------------------------------------------------------------------------------------
;Например строка
;$_sChars = EЕrгTТ
;примет вид масива:
;$Array[0] = EЕ
;$Array[1] = rг
;$Array[2] = TТ
;----------------
;При параметре $_iLen = 0
;масив будет иметь вид как выше
;а при $_iLen = 1
;$Array[0] = 3
;$Array[1] = rг
;$Array[2] = TТ
;$Array[3] = EЕ
;где $Array[0] = 3 это кол-во элементов в масиве
Func CharsSplitPairs_($_sChars, $_iLen = 1)
    Local $_sPairs = StringRegExp($_sChars, '[A-Za-zА-Яа-яЁё]{2}', 3)
    If @error Then
        Return SetError(1)
    EndIf
    If $_iLen Then
        $_iLen = UBound($_sPairs)
        ReDim $_sPairs[$_iLen +1]
        $_sPairs[$_iLen] = $_sPairs[0]
        $_sPairs[0] = $_iLen
    EndIf
    Return $_sPairs
EndFunc
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Не работает
 

Вложения

  • 123.zip
    1.9 КБ · Просмотры: 3

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
Исправил
Код:
;в эту строку можно добавить свои пары символов (ЮZжF) которые нужно заменить
;где ПЕРВЫЙ символ будет заменен на ВТОРОЙ ТРЕТИЙ на ЧЕТВЕРТЫЙ и т.д.
;пары можно не разделять или разделять любыми не буквенными символами
$sChars = 'ЕE еe гr ТT уy иu ОO оo РP рp КK кk НH дg аa АA хx ХX сc СC ьb ВB пn тm МM з3 З3 ч4 Ч4 шw ШW щw ЩW'

;здесь указываете путь к папке где лежат файлы которые нужно обработать
$sFoderIn = @ScriptDir& '\Новая папка'
;это путь к папке куда ложить измененные файлы и логи работы
$sFoderOut = @ScriptDir& '\ReplaceCyrillic'

Recursion_($sFoderIn)

Func Recursion_($_sFoder)
    Local $sWordsRusCyrillic, $sWordsChanged, $_sText, $_sWord, $_aAllWords, $_iA, $_iLog, $_sNewFile, $_sAllWorlds ='|', $_iCounter
    Local $_hList=FileFindFirstFile($_sFoder& '\*.*')
    While 1
        $_sFile=FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            Recursion_($_sFoder& '\'& $_sFile)
        ElseIf $_sFile <> @ScriptName Then
            $_iLog = 0
            $_sAllWorlds = '|'
			$_sWordsRusCyrillic = ''
            $_sWordsChanged = ''
            $_sText = FileRead($_sFoder& '\'& $_sFile)
            $_aAllWords = StringRegExp($_sText, '(?i)([A-Za-zА-Яа-яЁё]+).?', 3)
            If Not @error Then
                For $_iA = 0 To UBound($_aAllWords) -1
                    If Not StringInStr($_sAllWorlds, '|'& $_aAllWords[$_iA]& '|') Then
                        If Not WordIsEng_($_aAllWords[$_iA]) Then
                            If Not WordIsRus_($_aAllWords[$_iA]) Then
                                $_iLog = 1
                                $_sWord = ReplaceCyrillic_($_aAllWords[$_iA])
                                If WordIsEng_($_sWord) Then
                                    $_sText = StringReplace($_sText, $_aAllWords[$_iA], $_sWord)
                                    $_iCounter = @extended
                                    $_sWordsChanged &= $_aAllWords[$_iA]& ' > '& $_sWord& ' < ['& $_iCounter& ']'& @CRLF
                                Else
                                    $_sWordsRusCyrillic &= $_aAllWords[$_iA]& @CRLF
                                EndIf
                            EndIf
                        EndIf
                        $_sAllWorlds &= $_aAllWords[$_iA]& '|'
                    EndIf
                Next
                If $_iLog Then
                    $_sNewFile = StringReplace($_sFoder, $sFoderIn, $sFoderOut)
                    DirCreate($_sNewFile)
                    $_sNewFile &= '\'& $_sFile
                    FileWrite($_sNewFile, $_sText)
                    If $_sWordsChanged <> '' Then
                        FileWrite($_sNewFile& '.log', 'Слова которые были заменены (Оригинал > Замена < [Кол-во замен]):'& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', $_sWordsChanged& @CRLF& @CRLF)
                    EndIf
                    If $_sWordsRusCyrillic <> '' Then
                        FileWrite($_sNewFile& '.log', 'Слова которые все еще содержат русские буквы:'& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', $_sWordsRusCyrillic& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', 'Для их замены в дальнейшем нужно в скрипте в переменной $sChars добавить какую букву на какую заменить.'& @CRLF)
                    EndIf
                EndIf
            EndIf
        EndIf
    WEnd
EndFunc

Func WordIsEng_($_sWord)
    StringRegExpReplace($_sWord, '[А-Яа-яЁё]', '')
    Return (@extended = 0)
EndFunc

Func WordIsRus_($_sWord)
    StringRegExpReplace($_sWord, '[^А-Яа-яЁё]', '')
    Return (@extended = 0)
EndFunc

Func ReplaceCyrillic_($_sText)
    Local Static $_aChars = CharsSplitPairs_($sChars)
    Local $_iA, $_sReplaceable, $_sReplacing
    For $_iA = 1 To $_aChars[0]
        $_sReplaceable = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$1')
        $_sReplacing = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$2')
        $_sText = StringRegExpReplace($_sText, $_sReplaceable, $_sReplacing)
    Next
    Return $_sText
EndFunc

;ФУНКЦИЯ РАЗБИВАЕТ СТРОКУ НА МАСИВ, СОДЕРЖАЩИЙ В СЕБЕ ПАРЫ СИМВОЛОВ
;----------------------------------------------------------------------------------------------
;Например строка
;$_sChars = EЕrгTТ
;примет вид масива:
;$Array[0] = EЕ
;$Array[1] = rг
;$Array[2] = TТ
;----------------
;При параметре $_iLen = 0
;масив будет иметь вид как выше
;а при $_iLen = 1
;$Array[0] = 3
;$Array[1] = rг
;$Array[2] = TТ
;$Array[3] = EЕ
;где $Array[0] = 3 это кол-во элементов в масиве
Func CharsSplitPairs_($_sChars, $_iLen = 1)
    Local $_sPairs = StringRegExp($_sChars, '[A-Za-zА-Яа-яЁё]{2}', 3)
    If @error Then
        Return SetError(1)
    EndIf
    If $_iLen Then
        $_iLen = UBound($_sPairs)
        ReDim $_sPairs[$_iLen +1]
        $_sPairs[$_iLen] = $_sPairs[0]
        $_sPairs[0] = $_iLen
    EndIf
    Return $_sPairs
EndFunc
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Благодарю. А можно сделать ещё вариант, чтобы если слово из русских букв (похожих на английские) и цифр состоит, то чтобы русские буквы менялись на английские?


Добавлено:
Сообщение автоматически объединено:

Ещё хотелось бы узнать, если кодировка нужна будет на выходе другая, то как поступить? Сейчас преобразует в utf-8.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
Благодарю. А можно сделать ещё вариант, чтобы если слово из русских букв (похожих на английские) и цифр состоит, то чтобы русские буквы менялись на английские?
Ещё хотелось бы узнать, если кодировка нужна будет на выходе другая, то как поступить? Сейчас преобразует в utf-8.
Код:
;в эту строку можно добавить свои пары символов (ЮZжF) которые нужно заменить
;где ПЕРВЫЙ символ будет заменен на ВТОРОЙ ТРЕТИЙ на ЧЕТВЕРТЫЙ и т.д.
;пары можно не разделять или разделять любыми не буквенными символами
$sChars = 'ЕE еe гr ТT уy иu ОO оo РP рp КK кk НH дg аa АA хx ХX сc СC ьb ВB пn тm МM з3 З3 ч4 Ч4 шw ШW щw ЩW'

;здесь указываете путь к папке где лежат файлы которые нужно обработать
$sFoderIn = @ScriptDir& '\Новая папка'
;это путь к папке куда ложить измененные файлы и логи работы
$sFoderOut = @ScriptDir& '\ReplaceCyrillic'

;режим кодировки файла (возможные значения как у FileOpen() функции)
$iMode = 2 +8

Recursion_($sFoderIn)

Func Recursion_($_sFoder)
    Local $sWordsRusCyrillic, $sWordsChanged, $_sText, $_sWord, $_aAllWords, $_iA, $_iLog, $_sNewFile, $_sAllWorlds ='|', $_iCounter
    Local $_hList=FileFindFirstFile($_sFoder& '\*.*')
    While 1
        $_sFile=FileFindNextFile($_hList)
        If @error Then
            ExitLoop
        EndIf
        If @extended Then
            Recursion_($_sFoder& '\'& $_sFile)
        ElseIf $_sFile <> @ScriptName Then
            $_iLog = 0
            $_sAllWorlds = '|'
			$_sWordsRusCyrillic = ''
            $_sWordsChanged = ''
            $_sText = FileRead($_sFoder& '\'& $_sFile)
            $_aAllWords = StringRegExp($_sText, '(?i)([A-Za-zА-Яа-яЁё0-9]+).?', 3)
            If Not @error Then
                For $_iA = 0 To UBound($_aAllWords) -1
                    If Not StringInStr($_sAllWorlds, '|'& $_aAllWords[$_iA]& '|') Then
                        If Not WordIsEng_($_aAllWords[$_iA]) Then
                            If Not WordIsRus_($_aAllWords[$_iA]) Then
                                $_iLog = 1
                                $_sWord = ReplaceCyrillic_($_aAllWords[$_iA])
                                If WordIsEng_($_sWord) Then
                                    $_sText = StringReplace($_sText, $_aAllWords[$_iA], $_sWord)
                                    $_iCounter = @extended
                                    $_sWordsChanged &= $_aAllWords[$_iA]& ' > '& $_sWord& ' < ['& $_iCounter& ']'& @CRLF
                                Else
                                    $_sWordsRusCyrillic &= $_aAllWords[$_iA]& @CRLF
                                EndIf
                            EndIf
                        EndIf
                        $_sAllWorlds &= $_aAllWords[$_iA]& '|'
                    EndIf
                Next
                If $_iLog Then
                    $_sNewFile = StringReplace($_sFoder, $sFoderIn, $sFoderOut)
                    DirCreate($_sNewFile)
                    $_sNewFile &= '\'& $_sFile
					$hF=FileOpen($_sNewFile, $iMode)
                    FileWrite($hF, $_sText)
					FileClose($hF)
                    If $_sWordsChanged <> '' Then
                        FileWrite($_sNewFile& '.log', 'Слова которые были заменены (Оригинал > Замена < [Кол-во замен]):'& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', $_sWordsChanged& @CRLF& @CRLF)
                    EndIf
                    If $_sWordsRusCyrillic <> '' Then
                        FileWrite($_sNewFile& '.log', 'Слова которые все еще содержат русские буквы:'& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', $_sWordsRusCyrillic& @CRLF& @CRLF)
                        FileWrite($_sNewFile& '.log', 'Для их замены в дальнейшем нужно в скрипте в переменной $sChars добавить какую букву на какую заменить.'& @CRLF)
                    EndIf
                EndIf
            EndIf
        EndIf
    WEnd
EndFunc

Func WordIsEng_($_sWord)
    StringRegExpReplace($_sWord, '[А-Яа-яЁё]', '')
    Return (@extended = 0)
EndFunc

Func WordIsRus_($_sWord)
    StringRegExpReplace($_sWord, '[^А-Яа-яЁё0-9]', '')
    Return (@extended = 0)
EndFunc

Func ReplaceCyrillic_($_sText)
    Local Static $_aChars = CharsSplitPairs_($sChars)
    Local $_iA, $_sReplaceable, $_sReplacing
    For $_iA = 1 To $_aChars[0]
        $_sReplaceable = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$1')
        $_sReplacing = StringRegExpReplace($_aChars[$_iA], '(.)(.)', '$2')
        $_sText = StringRegExpReplace($_sText, $_sReplaceable, $_sReplacing)
    Next
    Return $_sText
EndFunc

;ФУНКЦИЯ РАЗБИВАЕТ СТРОКУ НА МАСИВ, СОДЕРЖАЩИЙ В СЕБЕ ПАРЫ СИМВОЛОВ
;----------------------------------------------------------------------------------------------
;Например строка
;$_sChars = EЕrгTТ
;примет вид масива:
;$Array[0] = EЕ
;$Array[1] = rг
;$Array[2] = TТ
;----------------
;При параметре $_iLen = 0
;масив будет иметь вид как выше
;а при $_iLen = 1
;$Array[0] = 3
;$Array[1] = rг
;$Array[2] = TТ
;$Array[3] = EЕ
;где $Array[0] = 3 это кол-во элементов в масиве
Func CharsSplitPairs_($_sChars, $_iLen = 1)
    Local $_sPairs = StringRegExp($_sChars, '[A-Za-zА-Яа-яЁё]{2}', 3)
    If @error Then
        Return SetError(1)
    EndIf
    If $_iLen Then
        $_iLen = UBound($_sPairs)
        ReDim $_sPairs[$_iLen +1]
        $_sPairs[$_iLen] = $_sPairs[0]
        $_sPairs[0] = $_iLen
    EndIf
    Return $_sPairs
EndFunc
 
Автор
L

lemonia

Новичок
Сообщения
126
Репутация
0
Благодарю.
Код:
;режим кодировки файла (возможные значения как у FileOpen() функции)
$iMode = 2 +8
Можно пример, как задать на выходе DOS-кодировку, т. есть CP866 или CP1251.
 

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
lemonia сказал(а):
Можно пример, как задать на выходе DOS-кодировку, т. есть CP866 или CP1251.
В этом случае тебе нужно поискать UDF на форуме для перекодировки текста в разные кодировки и приспособить к моему скрипту, так как стандартные параметры таких кодировок не знают (смотри описание в справке к функции FileOpen())


Добавлено:
Сообщение автоматически объединено:

Смотри: https://autoit-script.ru/index.php?topic=510.0
 
Верх