Что нового

Поиск и замена букв в .txt

Diesel

Новичок
Сообщения
35
Репутация
0
Доброго времени суток!

Этим скриптом нужно 'расшифровать' сообщение:
Код:
[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc

Код:
$sPath = 'text.txt'
$sTextOld1 = 'A'
$sTextOld2 = 'a'
$sTextOld3 = 'B'
$sTextOld4 = 'b'
$sTextOld5 = 'c'
$sTextOld6 = 'E'
$sTextOld7 = 'd'
$sTextOld8 = 'e'
$sTextOld9 = 'f'
$sTextOld10 = 'g'
$sTextOld11 = 'K'
$sTextOld12 = 'h'
$sTextOld13 = 'M'
$sTextOld14 = 'H'
$sTextOld15 = 'O'
$sTextOld16 = 'i'
$sTextOld17 = 'P'
$sTextOld18 = 'C'
$sTextOld19 = 'T'
$sTextOld20 = 'j'
$sTextOld21 = 'k'
$sTextOld22 = 'X'
$sTextOld23 = 'l'
$sTextOld24 = 'm'
$sTextOld25 = 'n'
$sTextOld26 = 'o'
$sTextOld27 = '*'
$sTextOld28 = 'q'
$sTextOld29 = 'r'
$sTextOld30 = 's'
$sTextOld31 = 't'
$sTextOld32 = 'u'

$sTextNew1 = 'А'
$sTextNew2 = 'Б'
$sTextNew3 = 'В'
$sTextNew4 = 'Г'
$sTextNew5 = 'Д'
$sTextNew6 = 'Е'
$sTextNew7 = 'Ж'
$sTextNew8 = 'З'
$sTextNew9 = 'И'
$sTextNew10 = 'Й'
$sTextNew11 = 'К'
$sTextNew12 = 'Л'
$sTextNew13 = 'М'
$sTextNew14 = 'Н'
$sTextNew15 = 'О'
$sTextNew16 = 'П'
$sTextNew17 = 'Р'
$sTextNew18 = 'С'
$sTextNew19 = 'Т'
$sTextNew20 = 'У'
$sTextNew21 = 'Ф'
$sTextNew22 = 'Х'
$sTextNew23 = 'Ц'
$sTextNew24 = 'Ч'
$sTextNew25 = 'Ш'
$sTextNew26 = 'Щ'
$sTextNew27 = 'Ъ'
$sTextNew28 = 'Ы'
$sTextNew29 = 'Ь'
$sTextNew30 = 'Э'
$sTextNew31 = 'Ю'
$sTextNew32 = 'Я'

$hFile = FileOpen($sPath, 0)
$sText = FileRead($hFile)
FileClose($hFile)

$sText = StringReplace($sText, $sTextOld1, $sTextNew1)
$sText = StringReplace($sText, $sTextOld2, $sTextNew2)
$sText = StringReplace($sText, $sTextOld3, $sTextNew3)
$sText = StringReplace($sText, $sTextOld4, $sTextNew4)
$sText = StringReplace($sText, $sTextOld5, $sTextNew5)
$sText = StringReplace($sText, $sTextOld6, $sTextNew6)
$sText = StringReplace($sText, $sTextOld7, $sTextNew7)
$sText = StringReplace($sText, $sTextOld8, $sTextNew8)
$sText = StringReplace($sText, $sTextOld9, $sTextNew9)
$sText = StringReplace($sText, $sTextOld10, $sTextNew10)
$sText = StringReplace($sText, $sTextOld11, $sTextNew11)
$sText = StringReplace($sText, $sTextOld12, $sTextNew12)
$sText = StringReplace($sText, $sTextOld13, $sTextNew13)
$sText = StringReplace($sText, $sTextOld14, $sTextNew14)
$sText = StringReplace($sText, $sTextOld15, $sTextNew15)
$sText = StringReplace($sText, $sTextOld16, $sTextNew16)
$sText = StringReplace($sText, $sTextOld17, $sTextNew17)
$sText = StringReplace($sText, $sTextOld18, $sTextNew18)
$sText = StringReplace($sText, $sTextOld19, $sTextNew19)
$sText = StringReplace($sText, $sTextOld20, $sTextNew20)
$sText = StringReplace($sText, $sTextOld21, $sTextNew21)
$sText = StringReplace($sText, $sTextOld22, $sTextNew22)
$sText = StringReplace($sText, $sTextOld23, $sTextNew23)
$sText = StringReplace($sText, $sTextOld24, $sTextNew24)
$sText = StringReplace($sText, $sTextOld25, $sTextNew25)
$sText = StringReplace($sText, $sTextOld26, $sTextNew26)
$sText = StringReplace($sText, $sTextOld27, $sTextNew27)
$sText = StringReplace($sText, $sTextOld28, $sTextNew28)
$sText = StringReplace($sText, $sTextOld29, $sTextNew29)
$sText = StringReplace($sText, $sTextOld30, $sTextNew30)
$sText = StringReplace($sText, $sTextOld31, $sTextNew31)
$sText = StringReplace($sText, $sTextOld32, $sTextNew32)

$hFile = FileOpen($sPath, 2)
$sText = FileWrite($hFile, $sText)
FileClose($hFile)


Чтобы было вот так:
Код:
[ЧЕЛОВЕК В МАСКЕ] КОГДА ТЫ ОКАЖЕШЬСЯ ПЕРЕД

Проблема в том что код не различает БОЛЬШИЕ и маленькие буквы...
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Diesel,
Можно примерно так попробовать.
Код:
$sStrCode = 'AaBbcEdefgKhMHOiPCTjkXlmno*qrstu';в этой строке символы должны быть уникальными.
$oDic = ObjCreate('Scripting.Dictionary')
$aTmp = StringSplit($sStrCode, '')
For $i = 1 To $aTmp[0]
	$oDic.add($aTmp[$i], Chr($i + 191))
Next
$aTmp = 0

$sStr = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'
$sDecodeStr = ''
$aTmp = StringSplit($sStr, '')
For $i = 1 To $aTmp[0]
	Switch $oDic.exists($aTmp[$i])
		Case 0
			$sDecodeStr &= $aTmp[$i]
		Case 1
			$sDecodeStr &= $oDic.item($aTmp[$i])
	EndSwitch
Next
ConsoleWrite($sDecodeStr & @LF)
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
madmasles
OffTopic:
Так понравился объект 'Scripting.Dictionary'?? :smile:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Diesel [?]
код не различает БОЛЬШИЕ и маленькие буквы
В каждой функции StringReplace() добавьте опцию учитывать регистр
Код:
$sText = StringReplace($sText, $sTextOld1, $sTextNew1, 0, 1)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
; $sPath = @ScriptDir&'\text.txt'
; $sText = FileRead($sPath)
$sText = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'

; $sTextOld = '`qwertyuiop[]asdfghjkl;''zxcvbnm,./~QWERTYUIOP{}ASDFGHJKL:"|ZXCVBNM<>?@#$^&'
; $sTextNew='ёйцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭ/ЯЧСМИТЬБЮ,"№;:?'
$sTextOld = 'AaBbcEdefgKhMHOiPCTjkXlmno*qrstu'
$sTextNew='АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'

For $i = 1 To StringLen($sText)
	$s = StringInStr($sTextOld, StringMid($sText, $i, 1), 1) ; получаем позицию каждого символа в строке подменяемых символов
	If $s Then $sText = StringReplace($sText, $i, StringMid($sTextNew, $s, 1)) ; если существует, то заменяем на символ в той же позиции подменяемых символов
Next
MsgBox(0, 'Сообщение', $sText)

; $hFile = FileOpen($sPath, 2)
; $sText = FileWrite($hFile, $sText)
; FileClose($hFile)


Вариант 2

Код:
$sText = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'

$sTextOld = 'AaBbcEdefgKhMHOiPCTjkXlmno*qrstu'
$aTextNew=StringSplit('АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', '') 

$a = StringSplit($sText, '')
For $i = 1 To $a[0]
	$s = StringInStr($sTextOld, $a[$i], 1) ; получаем позицию каждого символа в строке подменяемых символов
	If $s Then $sText = StringReplace($sText, $i, $aTextNew[$s]) ; если существует, то заменяем на символ в той же позиции подменяемых символов
Next
MsgBox(0, 'Сообщение', $sText)
 

xaker

Знающий
Сообщения
52
Репутация
16
а так еще быстрее:
Код:
Global $aOld[33] = [32,'A','a','B','b','c','E','d','e','f','g','K','h','M','H','O','i','P','C','T','j','k','X','l','m','n','o','*','q','r','s','t','u']
Global $aNew[33] = [32,'А','Б','В','Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ч','Ш','Щ','Ъ','Ы','Ь','Э','Ю','Я']

$sText = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'

For $i = 1 To $aOld[0]
	$sText = StringReplace($sText, $aOld[$i], $aNew[$i], 0, 2)
Next

ConsoleWrite($sText & @CRLF )
 
Автор
D

Diesel

Новичок
Сообщения
35
Репутация
0
Ребят, всем спасибо за быструю помощь. :beer:
AZJIO, твой вариант подходит идеально! :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
xaker
Почему ещё? На чём основано утверждение? Я предполагал такой вариант но не уверен, что он должен быть быстрее.
Рассчёт мой таков:
Дано текст 100 символов, шаблон 32 символа
1. В твоём варианте 32 раза прокрутит текст по 100 символов, итого 32*100 шагов.
2. В моём вариант 100 раз прокрутит текст в шаблоне из 32 символов, итого 100*32.
Исключения: в твоём поиск идёт до конца, независимо от совпадения, в моём поиск идёт до первого совпадения и заменяет указанный бит в шаблоне.


xaker
Да, твой вариант быстрее, но я это проверил фактом, а не предположением, которое может быть обманчиво.
Код:
; $sText = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'
$sText = 'ldsfjngkdfhgskthospmeigsjedhsdpffgdsfgdfmgsdfgsdfsfgsdfgsdfgsdfgsdfgsdasdfdafadsfawerqwerasdfafawefawefawefsedafdfae'
; $sText = 'выапвыапывапывавпаратчмстиавптврповапрыварпыорпаовапрвапрывапывапыерукоркерячварвапывапыекунцкуенкупы'
; $sText = 'ldsfjng'

$sTextOld = 'AaBbcEdefgKhMHOiPCTjkXlmno*qrstu'
$aTextNew = StringSplit('АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ', '')

$timer2 = TimerInit()

$a = StringSplit($sText, '')
For $i = 1 To $a[0]
	$s = StringInStr($sTextOld, $a[$i], 1) ; получаем позицию каждого символа в строке подменяемых символов
	If $s Then $sText = StringReplace($sText, $i, $aTextNew[$s]) ; если существует, то заменяем на символ в той же позиции подменяемых символов
Next
$timer2 = 'Мой Время2 : ' & Round(TimerDiff($timer2), 2) & ' сек, ' & $sText


; $sText = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'
$sText = 'ldsfjngkdfhgskthospmeigsjedhsdpffgdsfgdfmgsdfgsdfsfgsdfgsdfgsdfgsdfgsdasdfdafadsfawerqwerasdfafawefawefawefsedafdfae'
; $sText = 'выапвыапывапывавпаратчмстиавптврповапрыварпыорпаовапрвапрывапывапыерукоркерячварвапывапыекунцкуенкупы'
; $sText = 'ldsfjng'

Global $aOld[33] = [32, 'A', 'a', 'B', 'b', 'c', 'E', 'd', 'e', 'f', 'g', 'K', 'h', 'M', 'H', 'O', 'i', 'P', 'C', 'T', 'j', 'k', 'X', 'l', 'm', 'n', 'o', '*', 'q', 'r', 's', 't', 'u']
Global $aNew[33] = [32, 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я']
$timer1 = TimerInit()

; $sText = '[mEhOBEK B MACKE] KObcA Tq OKAdEnrCu iEPEc'

For $i = 1 To $aOld[0]
	$sText = StringReplace($sText, $aOld[$i], $aNew[$i], 0, 2)
Next
$timer1 = 'Твой Время1 : ' & Round(TimerDiff($timer1), 2) & ' сек, ' & $sText

MsgBox(0, "Время выполнения", $timer1 & @CRLF & $timer2)
 
Верх