Что нового

[RegExp] замена английских слов на русские

Alex Bit

Новичок
Сообщения
24
Репутация
0
Всем привет.Встала необходимость решить с AutoIT задачку .Из текстового документа (А) взять строку с английскими словами ,перевести слова на русский и записать в текстовый документ (В).Мои мысли по решению этой задачи таковы.Объявить 2 массива, массив английских слов и по индексам ему соответствуют массив из русских слов.Помогите пожалуйста с эффективным кодом основной задачи
 

axlwor

Скриптер
Сообщения
657
Репутация
147
1. копировать в буфер обмена
2. зайти на сайт переводчика (e.g. переводчик гугля)
3. вставить в поле перевода. выбрать направление перевода. перевести. скопировать переведенный текст
4. вставить в новый документ
ps. хотя... вроде гугль целыми документами переводит
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Alex Bit
Я как раз на днях переводил тексты

Для Client for Google Translate

Код:
$Title='Client for Google Translate - Pro'
If Not WinWait($Title, '', 5) Then
	MsgBox(0, 'Сообщение', 'Ненайдено окно переводчика'&@CRLF&$Title &@CRLF&'Завершаем работу')
	Exit
EndIf

WinActivate($Title)
Sleep(300)
If Not WinActive($Title) Then
	MsgBox(0, 'Сообщение', 'Окно переводчика не активно'&@CRLF&$Title &@CRLF&'Завершаем работу')
	Exit
EndIf

$gp=WinGetPos($Title)
$mcX=$gp[0]+100
$mcY=$gp[1]+$gp[3]/2

$tmp=''
Global $Error=''
$search = _FileFindFirstFile(@ScriptDir&"\*.txt",1)
If $search = -1 Then
    MsgBox(0, 'Сообщение', 'Ничего не найдено')
    Exit
EndIf
$k=1
While 1
    $file = _FileFindNextFile($search)
    If @error Then ExitLoop
	$fileH = FileOpen(@ScriptDir&'\'&$file, 0)
	$text = FileRead($fileH)
	FileClose($fileH)
	ClipPut($text)
	Sleep(100)
	; Send('^м')
	MouseClick('left', $mcX, $mcY, 1, 0)
	Sleep(200)
	; ToolTip('клик сделан')
	$i=0
	While 1
		$text=ControlGetText($Title, '', '[CLASS:RichTextWndClass; INSTANCE:4]')
		If Not StringInStr($text, @CRLF) Then
			Sleep(200)
			$i+=1
			ToolTip($k&' - '&$file&@CRLF&' - ожидание')
		Else
			Send('^ф')
			Sleep(30)
			Send('^с')
			ControlSetText('Client for Google Translate - Pro', '', '[CLASS:RichTextWndClass; INSTANCE:4]', '')
			ToolTip($k&' - '&$file&@CRLF&' - вставка')
			ExitLoop
		EndIf
		If $i = 100 Then
			MsgBox(0, 'Сообщение', 'Уже 20 секунд ожидания')
			_SaveError()
		EndIf
	WEnd
	$text=ClipGet()
	If $tmp=$text Then MsgBox(0, 'Сообщение', 'Повтор '&$file)
	$tmp=$text
	ToolTip($k&' - '&$file&@CRLF&' - сохранение')
	;сверка
	$tmp1=StringStripWS(StringRegExpReplace($text,'(?s)(^.*?\r\n)(.*?)(\r\n.*)$','\2'), 8)
	$tmp2=StringTrimRight($file, 4)
	If $tmp1<>$tmp2 Then $Error&=$tmp1&' - '&$tmp2 &@CRLF
	If FileExists(@ScriptDir&'\new\'&$file) Then $Error&=$file&' - уже существует, повтор' &@CRLF
	
	$fileH = FileOpen(@ScriptDir&'\new\'&$file,2)
	FileWrite($fileH, $text)
	FileClose($fileH)
	$k+=1
	
WEnd
_FileFindClose($search)
MsgBox(0, 'Сообщение', 'Готово '&@CRLF&$Error)
_SaveError()

Func _SaveError()
	If $Error<>'' Then
		$file = FileOpen(@ScriptDir&'\!!!_Error.txt',2)
		FileWrite($file, $Error)
		FileClose($file)
	EndIf
	Exit
EndFunc
;********************************************************************************************************************************

; #INDEX# =======================================================================================================================
; Title .........: FileFind
; AutoIt Version : 3.2.3++
; Language ......: Русский
; Description ...: Поиск файлов, включая подкаталоги, синтаксис и возвращаемое значение совпадают с FileFindFirstFile()
;                  FileFindNextFile(), в FileFindFirstFile("filename" [,flag]) добавлен необязатенльный параметр flag
;                  flag=1 - поиск файлов
;                  flag=2 - поиск каталогов , по умолчанию flag=3
; Author(s) .....: Nikzzzz
; ===============================================================================================================================

Func _FileFindFirstFile($sFile,$iMode=3)
    Local $avStack[5]
    $avStack[0] = 0
    $avStack[1] = StringMid($sFile, StringInStr($sFile, "\", 0, -1) + 1)
    $avStack[1] = StringRegExpReplace($avStack[1], "[\\\(\)\{\}\+\$\.]", "\\\0")
    $avStack[1] = StringReplace($avStack[1], "*", ".*")
    $avStack[1] = StringReplace($avStack[1], "?", ".")
    $avStack[2] = $iMode
    $avStack[3] = StringLeft($sFile, StringInStr($sFile, "\", 0, -1) - 1)
    $avStack[4] = FileFindFirstFile($avStack[3] & "\*.*")
    If $avStack[4] = -1 Then
        SetError(1)
        Return -1
    EndIf
    Return $avStack
EndFunc   ;==>_FileFindFirstFile

Func _FileFindNextFile(ByRef $avStack)
    Local $sFindFile
    While 1
        $sFindFile = FileFindNextFile($avStack[$avStack[0] + 4])
        If Not @error Then
            If StringInStr(FileGetAttrib($avStack[$avStack[0] + 3] & "\" & $sFindFile), "D") > 0 Then
                $avStack[0] += 2
                ReDim $avStack[$avStack[0] + 5]
                $avStack[$avStack[0] + 3] = $avStack[$avStack[0]+1] & "\" & $sFindFile
                $avStack[$avStack[0] + 4] = FileFindFirstFile($avStack[$avStack[0] + 3] & "\*.*")
                If BitAND($avStack[2],2) Then Return StringMid($avStack[$avStack[0] + 3], StringLen($avStack[3]) + 2)
                ContinueLoop
            Else
                If StringRegExpReplace($sFindFile, $avStack[1], "") = "" Then
                    SetError(0)
                    If BitAND($avStack[2],1) Then Return StringMid($avStack[$avStack[0] + 3] & "\" & $sFindFile, StringLen($avStack[3]) + 2)
                Else
                    ContinueLoop
                EndIf
            EndIf
        Else
            If $avStack[0] = 0 Then
                SetError(-1)
                Return ""
            Else
                FileClose($avStack[$avStack[0] + 4])
                $avStack[0] -= 2
                ReDim $avStack[$avStack[0] + 5]
            EndIf
        EndIf
    WEnd
EndFunc   ;==>_FileFindNextFile

Func _FileFindClose(ByRef $avStack)
    Local $iRetVaue
    While $avStack[0] >= 0
        $iRetVaue=FileClose($avStack[$avStack[0] + 4])
        $avStack[0] -= 2
    WEnd
    ReDim $avStack[1]
    Return $iRetVaue
EndFunc   ;==>_FileFindClose

Для QTranslate
Код:
$Title='QTranslate'
If Not WinWait($Title, '', 5) Then
	MsgBox(0, 'Сообщение', 'Ненайдено окно переводчика'&@CRLF&$Title &@CRLF&'Завершаем работу')
	Exit
EndIf

WinActivate($Title)
Sleep(300)
If Not WinActive($Title) Then
	MsgBox(0, 'Сообщение', 'Окно переводчика не активно'&@CRLF&$Title &@CRLF&'Завершаем работу')
	Exit
EndIf

$tmp=''
Global $Error=''
$search = _FileFindFirstFile(@ScriptDir&"\*.txt",1)
If $search = -1 Then
    MsgBox(0, 'Сообщение', 'Ничего не найдено')
    Exit
EndIf
$k=1
While 1
    $file = _FileFindNextFile($search)
    If @error Then ExitLoop
	
	$fileH = FileOpen(@ScriptDir&'\'&$file, 0)
	$text = FileRead($fileH)
	FileClose($fileH)
	ControlSetText($Title, '', '[CLASS:RichEdit20W; INSTANCE:1]', $text)
	Sleep(100)
	ControlClick($Title, '', '[CLASS:Button; INSTANCE:1]')
	Sleep(200)
	$i=0
	While 1
		$text=ControlGetText($Title, '', '[CLASS:RichEdit20W; INSTANCE:2]')
		If Not StringInStr($text, @CRLF) Then
			Sleep(200)
			$i+=1
			ToolTip($k&' - '&$file&@CRLF&' - ожидание')
		Else
			ControlSetText('Client for Google Translate - Free', '', '[CLASS:RichTextWndClass; INSTANCE:4]', '')
			ToolTip($k&' - '&$file&@CRLF&' - вставка')
			ExitLoop
		EndIf
		If $i = 100 Then
			MsgBox(0, 'Сообщение', 'Уже 20 секунд ожидания')
			_SaveError()
		EndIf
	WEnd
	If $tmp=$text Then MsgBox(0, 'Message', 'Повтор '&$file)
	$tmp=$text
	ToolTip($k&' - '&$file&@CRLF&' - сохранение')
	;сверка
	$tmp1=StringStripWS(StringRegExpReplace($text,'(?s)(^.*?\r\n)(.*?)(\r\n.*)$','\2'), 8)
	$tmp2=StringTrimRight($file, 4)
	If $tmp1<>$tmp2 Then $Error&=$tmp1&' - '&$tmp2 &@CRLF
	If FileExists(@ScriptDir&'\new\'&$file) Then $Error&=$file&' - уже существует, повтор' &@CRLF
	
	$fileH = FileOpen(@ScriptDir&'\new\'&$file,2)
	FileWrite($fileH, $text)
	FileClose($fileH)
	$k+=1
	
WEnd
_FileFindClose($search)
MsgBox(0, 'Сообщение', 'Готово '&@CRLF&$Error)
_SaveError()

Func _SaveError()
	If $Error<>'' Then
		$file = FileOpen(@ScriptDir&'\!!!_Error.txt',2)
		FileWrite($file, $Error)
		FileClose($file)
	EndIf
	Exit
EndFunc
;********************************************************************************************************************************

; #INDEX# =======================================================================================================================
; Title .........: FileFind
; AutoIt Version : 3.2.3++
; Language ......: Русский
; Description ...: Поиск файлов, включая подкаталоги, синтаксис и возвращаемое значение совпадают с FileFindFirstFile()
;                  FileFindNextFile(), в FileFindFirstFile("filename" [,flag]) добавлен необязатенльный параметр flag
;                  flag=1 - поиск файлов
;                  flag=2 - поиск каталогов , по умолчанию flag=3
; Author(s) .....: Nikzzzz
; ===============================================================================================================================

Func _FileFindFirstFile($sFile,$iMode=3)
    Local $avStack[5]
    $avStack[0] = 0
    $avStack[1] = StringMid($sFile, StringInStr($sFile, "\", 0, -1) + 1)
    $avStack[1] = StringRegExpReplace($avStack[1], "[\\\(\)\{\}\+\$\.]", "\\\0")
    $avStack[1] = StringReplace($avStack[1], "*", ".*")
    $avStack[1] = StringReplace($avStack[1], "?", ".")
    $avStack[2] = $iMode
    $avStack[3] = StringLeft($sFile, StringInStr($sFile, "\", 0, -1) - 1)
    $avStack[4] = FileFindFirstFile($avStack[3] & "\*.*")
    If $avStack[4] = -1 Then
        SetError(1)
        Return -1
    EndIf
    Return $avStack
EndFunc   ;==>_FileFindFirstFile

Func _FileFindNextFile(ByRef $avStack)
    Local $sFindFile
    While 1
        $sFindFile = FileFindNextFile($avStack[$avStack[0] + 4])
        If Not @error Then
            If StringInStr(FileGetAttrib($avStack[$avStack[0] + 3] & "\" & $sFindFile), "D") > 0 Then
                $avStack[0] += 2
                ReDim $avStack[$avStack[0] + 5]
                $avStack[$avStack[0] + 3] = $avStack[$avStack[0]+1] & "\" & $sFindFile
                $avStack[$avStack[0] + 4] = FileFindFirstFile($avStack[$avStack[0] + 3] & "\*.*")
                If BitAND($avStack[2],2) Then Return StringMid($avStack[$avStack[0] + 3], StringLen($avStack[3]) + 2)
                ContinueLoop
            Else
                If StringRegExpReplace($sFindFile, $avStack[1], "") = "" Then
                    SetError(0)
                    If BitAND($avStack[2],1) Then Return StringMid($avStack[$avStack[0] + 3] & "\" & $sFindFile, StringLen($avStack[3]) + 2)
                Else
                    ContinueLoop
                EndIf
            EndIf
        Else
            If $avStack[0] = 0 Then
                SetError(-1)
                Return ""
            Else
                FileClose($avStack[$avStack[0] + 4])
                $avStack[0] -= 2
                ReDim $avStack[$avStack[0] + 5]
            EndIf
        EndIf
    WEnd
EndFunc   ;==>_FileFindNextFile

Func _FileFindClose(ByRef $avStack)
    Local $iRetVaue
    While $avStack[0] >= 0
        $iRetVaue=FileClose($avStack[$avStack[0] + 4])
        $avStack[0] -= 2
    WEnd
    ReDim $avStack[1]
    Return $iRetVaue
EndFunc   ;==>_FileFindClose
 
Автор
A

Alex Bit

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

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
Alex Bit
Код:
#include <file.au3>
Global $aEnRu
If Not _FileReadToArray(@ScriptDir&'\En-Ru.txt', $aEnRu) Then
   MsgBox(4096,"Ошибка", "Невозможно прочитать массив" & @error)
   Exit
EndIf

$file = FileOpen(@ScriptDir&'\textEn.txt', 0)
$text = FileRead($file)
FileClose($file)

For $i = 1 to $aEnRu[0]
	$aTmp=StringSplit($aEnRu[$i], '=')
    ; $text=StringReplace($text, $aTmp[1], $aTmp[2]) ; на английский
    $text=StringReplace($text, $aTmp[2], $aTmp[1]) ; на русский
Next

$file = FileOpen(@ScriptDir&'\textRu.txt',2)
FileWrite($file, $text)
FileClose($file)

Формат En-Ru.txt такой
Привет=Hello
Плохой=Bad
Вчера=Yesterday
Один=One
Самолёт=Plane
текст из файла textEn.txt переводится в textRu.txt
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Большое спасибо за интересный подход.Код понятен.У меня честно говоря в голове вертелось нечто более сложное.Только не могу понять почему у меня вылазит сообщение "Не возможно прочитать массив 1".Хотя En-Ru.txt лежит в той-же директории что и скрипт.
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Есть ли возможность что-бы скрипт не обращал внимание на верхний и нижний регистр?
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Большое Всем спасибо!!!Тема закрыта.
 

joparezzz

Новичок
Сообщения
65
Репутация
0
Код:
#include <file.au3>
Global $aRuEn
If Not _FileReadToArray(@ScriptDir&'\Ru-En.txt', $aRuEn) Then
   MsgBox(4096,"Ошибка", "Невозможно прочитать массив" & @error)
   Exit
EndIf

$file = FileOpen(@ScriptDir&'\textRu.txt', 128)
$text = FileRead($file)
FileClose($file)

For $i = 1 to $aRuEn[0]
    $aTmp=StringSplit($aRuEn[$i], '=')
    $text=StringReplace($text, $aTmp[1], $aTmp[2]) ; на английский
Next

$file = FileOpen(@ScriptDir&'\textEn.txt',128 + 2)
FileWrite($file, $text)
FileClose($file)


если, например, в файле En-Ru.txt будут слова:
Код:
сам=himself
самолет=plane
а как можно реализовать, чтоб проверялось слово целиком а не побуквенно.. т.е. до 100% совпадения всего слова до знака =.
Например если в файле textRu.txt будет слово "самолет", то программа переводит не корректно, а именно, переведет слово "сам" а "олет" оставляет неизменным. Т.е. в файле textEn.txt, выглядить так "himselfолет".
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Так?
Код:
Global $i = 0

$file = FileOpen(@ScriptDir&'\Ru-En.txt')
$text = FileRead($file)
FileClose($file)

$aTransDicRU = StringRegExp($text, '(\S+)\=', 3)
$aTransDicEN = StringRegExp($text, '\=(\S+)', 3)

$file = FileOpen(@ScriptDir&'\text.txt')
$text = FileRead($file)
FileClose($file)

While 1

	If $text == $aTransDicRU[$i] Then
		FileWrite(@ScriptDir&'\textRu.txt', $aTransDicEN[$i])
		ExitLoop
	EndIf

	If $text == $aTransDicEN[$i] Then
		FileWrite(@ScriptDir&'\textEn.txt', $aTransDicRU[$i])
		ExitLoop
	EndIf

	$i += 1

WEnd

В наличии должно быть три файла
Ru-En.txt = словарь
text.txt = слово для перевода
textEn.txt и textRu.txt = фалы для записи результатов
 

joparezzz

Новичок
Сообщения
65
Репутация
0
выдает ошибку тут:
Код:
If $text == $aTransDicRU[$i] Then
If $text == ^ ERROR


К тому же в твоем примере предполагается что в файле text.txt только одно слово.. Мне надо чтоб в этом файле было много слов, программа делала поиск слов при нахождении переводила...
 
Верх