Что нового

[Данные, строки] Извлечь японские иероглифы и их описание из текста

Nelsy

Знающий
Сообщения
35
Репутация
8
Здравствуйте! Помогите пожалуйста извлечь из текста нужные японские иероглифы, перевод и описание к ним.

Код:
...

<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%B8%80">
一</A></DIV></TD>
<TD >один</TD>
<TD >いち<DIV><FONT color='#AAAAAA'>ити</FONT><DIV></TD>
<TD >ひと<DIV><FONT color='#AAAAAA'>хито</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%BA%8C">
二</A></DIV></TD>
<TD >два</TD>
<TD >に<DIV><FONT color='#AAAAAA'>ни</FONT><DIV></TD>
<TD >ふた<DIV><FONT color='#AAAAAA'>фута</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%B8%89">
三</A></DIV></TD>
<TD >три</TD>
<TD >さん<DIV><FONT color='#AAAAAA'>сан</FONT><DIV></TD>
<TD >み<DIV><FONT color='#AAAAAA'>ми</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E5%9B%9B">
四</A></DIV></TD>
<TD >четыре</TD>
<TD >し<DIV><FONT color='#AAAAAA'>си</FONT><DIV></TD>
<TD >よ<DIV><FONT color='#AAAAAA'>ё</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%BA%94">
五</A></DIV></TD>
<TD >пять</TD>
<TD >ご<DIV><FONT color='#AAAAAA'>го</FONT><DIV></TD>
<TD >いつ<DIV><FONT color='#AAAAAA'>ицу</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E5%85%AD">
六</A></DIV></TD>
<TD >шесть</TD>
<TD >ろく<DIV><FONT color='#AAAAAA'>року</FONT><DIV></TD>
<TD >む<DIV><FONT color='#AAAAAA'>му</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%B8%83">
七</A></DIV></TD>
<TD >семь</TD>
<TD >しち<DIV><FONT color='#AAAAAA'>сити</FONT><DIV></TD>
<TD >なな<DIV><FONT color='#AAAAAA'>нана</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E5%85%AB">
八</A></DIV></TD>
<TD >восемь</TD>
<TD >はち<DIV><FONT color='#AAAAAA'>хати</FONT><DIV></TD>
<TD >や<DIV><FONT color='#AAAAAA'>я</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%B9%9D">
九</A></DIV></TD>
<TD >девять</TD>
<TD >きゅう<DIV><FONT color='#AAAAAA'>кюу</FONT><DIV></TD>
<TD >ここの<DIV><FONT color='#AAAAAA'>коконо</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E5%8D%81">
十</A></DIV></TD>
<TD >десять</TD>
<TD >じゅう<DIV><FONT color='#AAAAAA'>дзюу</FONT><DIV></TD>
<TD >とお<DIV><FONT color='#AAAAAA'>тоо</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E7%99%BE">
百</A></DIV></TD>
<TD >сто</TD>
<TD >ひゃく<DIV><FONT color='#AAAAAA'>хяку</FONT><DIV></TD>
<TD >もも<DIV><FONT color='#AAAAAA'>момо</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E5%8D%83">
千</A></DIV></TD>
<TD >тысяча</TD>
<TD >せん<DIV><FONT color='#AAAAAA'>сэн</FONT><DIV></TD>
<TD >ち<DIV><FONT color='#AAAAAA'>ти</FONT><DIV></TD>
</TR>
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E4%B8%8A">
上</A></DIV></TD>
<TD >наверху</TD>
<TD >じょう<DIV><FONT color='#AAAAAA'>дзёу</FONT><DIV></TD>
<TD >うえ<DIV><FONT color='#AAAAAA'>уэ</FONT><DIV></TD>
</TR>

...

Пример:
Код:
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E6%B0%B4">
水</A></DIV></TD>
<TD >вода</TD>
<TD >すい<DIV><FONT color='#AAAAAA'>суи</FONT><DIV></TD>
<TD >みず<DIV><FONT color='#AAAAAA'>мидзу</FONT><DIV></TD>
</TR>


Интересуют нас строки 2,3,4,5
2 - Кандзи иероглиф - 水
3 - Перевод иероглифа - вода
4 - Онное произношение записаное азбукой Хирагана (すい) и на кирилице (суи)
5 - Кунное произношение записаное азбукой Хирагана (みず) и на кирилице (мидзу)

Нам же надо извлечь эти данные и записать в текстовый файл в следующем формате:
[иероглиф из строки 2][таб][перевод из строки 3][ | ][ онное произношение на хирагане из строки 4][пробел][онное произношение на кирилице из строки 4][ | ][кунное произношение на хирагане из строки 5][пробел][кунное произношение на кирилице из строки 5]

На выходе получаем файл с следующим содержанием:
水 вода | すい суи | みず мидзу
一 один | いち ити | ひと хито
二 два | に ни | ふた фута
三 три | さん сан | み ми
四 четыре | し си | よ ё

Также иногда некоторые данные могут отсутствовать :
Например в описании иероглифа может не быть произношения Он или Кун или того и другого одновременно, в итоге на выходе мы должны получить следующее.

Нету произношения Кун
王 правитель | おう оу |
Код:
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E7%8E%8B">
王</A></DIV></TD>
<TD >правитель</TD>
<TD >おう <DIV><FONT color='#AAAAAA'>оу</FONT><DIV></TD>
<TD ><DIV><FONT color='#AAAAAA'></FONT><DIV></TD>
</TR>

Нету произношения Он
生 необработанный | | なま нама
Код:
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E7%94%9F">
生</A></DIV></TD>
<TD >необработанный</TD>
<TD ><DIV><FONT color='#AAAAAA'></FONT><DIV></TD>
<TD >なま<DIV><FONT color='#AAAAAA'>нама</FONT><DIV></TD>
</TR>

Нету того и другого
赤 красный цвет | |
Код:
<TR ><TD class="HintDataTableCell" onMouseOver="javascript:showsmarttip(this,event,'center',7);" onMouseOut="javascript:hidetip();" ><DIV><A href="kandzi_view.php?kandzi=%E8%B5%A4">
赤</A></DIV></TD>
<TD >красный цвет</TD>
<TD ><DIV><FONT color='#AAAAAA'></FONT><DIV></TD>
<TD ><DIV><FONT color='#AAAAAA'></FONT><DIV></TD>
</TR>

Наверное можно было обьяснить и проще, извините за много букв.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Nelsy,
Попробуйте так.
Код:
#include <Array.au3>

$iCount = 0
$iUb2 = 3
$sFileOut = @ScriptDir & '\out.txt'
$sNewText = ''
$sText = FileRead(@ScriptDir & '\kanji.txt')
$aText = StringRegExp($sText, '(?si)<tr\s?>(.*?)</tr>', 3)
If @error Then
	MsgBox(16, 'Error', 'StringRegExp')
	Exit
EndIf
Dim $aResult[UBound($aText) + 1][$iUb2 + 1]
For $i = 0 To UBound($aText) - 1
	$aTemp = StringRegExp($aText[$i], '(?si)<(?:a|td|font).*?>\r?\n?([^<>]+)</', 3)
	If Not @error Then
		$iCount += 1
		$iEnd = UBound($aTemp) - 1
		If $iEnd > $iUb2 Then $iEnd = $iUb2
		For $j = 0 To $iEnd
			$aResult[$iCount][$j] = $aTemp[$j]
			$sNewText &= $aTemp[$j] & ' |'
		Next
		$sNewText = StringTrimRight($sNewText, 2) & @CRLF
	EndIf
Next
If $iCount Then
	ReDim $aResult[$iCount + 1][$iUb2 + 1]
	$aResult[0][0] = $iCount
	_ArrayDisplay($aResult)
	$hFile = FileOpen($sFileOut, 1)
	If $hFile <> -1 Then
		FileWrite($hFile, $sNewText)
		FileClose($hFile)
	EndIf
Else
	MsgBox(16, 'Error', 'Error')
EndIf
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Код:
#include <Array.au3>

Dim $sResult
Dim $aString[1]
$hFile = FileOpen("kanji.txt", 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
$hFile2 = FileOpen("out.txt", 1)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

$iLine = 1
While 1
	$iLine += 1
    $tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "(.*?)</A></DIV></TD>",2)
	$sLine = $aResult[1] & "	"
	$iLine += 1

	$tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "<TD >(.*?)</TD>",2)
	$sLine &= $aResult[1] & " | "
	$iLine += 1

	$tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "<TD >(.*?)<DIV><FONT color='#AAAAAA'>(.*?)</FONT><DIV></TD>",2)
	$sLine &= $aResult[1] & " " & $aResult[2] & " | "
	$iLine += 1

	$tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "<TD >(.*?)<DIV><FONT color='#AAAAAA'>(.*?)</FONT><DIV></TD>",2)
	$sLine &= $aResult[1] & " " & $aResult[2] & @CR
	$iLine += 2
	$aString[0] += 1
	_ArrayAdd($aString,$sLine)
WEnd

For $i = 1 To UBound($aString) - 1
	FileWrite($hFile2, $aString[$i])
Next

FileClose($hFile2)
FileClose($hFile)
Exit
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Спасибо за работу ^_^
Я тоже закончил свой код, но ваш вариант получился интересней в плане реализации.
А в остальном различия таковы:
[box title=У вас на выходе получается]
一 |один |ити |хито
二 |два |ни |фута
三 |три |сан |ми
四 |четыре |си |ё
五 |пять |го |ицу
[/box]
[box title=А у меня]
一 один | いち ити | ひと хито
二 два | に ни | ふた фута
三 три | さん сан | み ми
四 четыре | し си | よ ё
五 пять | ご го | いつ ицу
[/box]
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 320
Nelsy [?]
А в остальном различия таковы:
А так?
Код:
#include <Array.au3>

$iCount = 0
$sFileOut = @ScriptDir & '\out.txt'
$sNewText = ''
$sText = FileRead(@ScriptDir & '\kanji.txt')
$aText = StringRegExp($sText, '(?si)<tr\s?>(.*?)</tr>', 3)
If @error Then
	MsgBox(16, 'Error', 'StringRegExp')
	Exit
EndIf
Dim $aResult[UBound($aText) + 1][4]
For $i = 0 To UBound($aText) - 1
	$aTemp = StringSplit(StringRegExpReplace($aText[$i], '<.*?>', ' '), @CRLF, 1)
	If $aTemp[0] = 6 Then
		$iCount += 1
		For $j = 2 To 5
			If StringRegExp($aTemp[$j], '[^\s]') Then
				$aResult[$iCount][$j - 2] = StringStripWS($aTemp[$j], 7)
				If $j <> 2 Then
					$sNewText &= $aResult[$iCount][$j - 2] & ' | '
				Else
					$sNewText &= $aResult[$iCount][$j - 2] & @TAB
				EndIf
			EndIf
		Next
		$sNewText = StringTrimRight($sNewText, 3) & @CRLF
	EndIf
Next
If $iCount Then
	ReDim $aResult[$iCount + 1][4]
	$aResult[0][0] = $iCount
	_ArrayDisplay($aResult)
	$hFile = FileOpen($sFileOut, 1)
	If $hFile <> -1 Then
		FileWrite($hFile, $sNewText)
		FileClose($hFile)
	EndIf
Else
	MsgBox(16, 'Error', 'Error')
EndIf
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Главным критерием был ТАБ между иероглифом и переводом
[box title=][иероглиф из строки 2][таб][перевод из строки 3][/box]
Тема решена
 
Автор
N

Nelsy

Знающий
Сообщения
35
Репутация
8
Код:
#include <Array.au3>

Dim $sResult
Dim $aString[1]
Dim $Hiragana[77]
Dim $Katakana[77]
$hFile = FileOpen("kanji.txt", 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
$hFile2 = FileOpen("out.txt", 1)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
$hFile3 = FileOpen("HiraKata.txt", 0)
If $hFile = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf
$i = 1
While 1
	$tmpLine = FileReadLine($hFile3, $i)
	If @error = -1 Then ExitLoop
	$Hiragana[$i] = StringMid($tmpLine, 1, 1)
	$Katakana[$i] = StringMid($tmpLine, 2, 1)
	$i += 1
WEnd
$iLine = 1
While 1
	$iLine += 1
    $tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "(.*?)</A></DIV></TD>",2)
	$sLine = $aResult[1] & "	"
	$iLine += 1

	$tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "<TD >(.*?)</TD>",2)
	$sLine &= $aResult[1] & " | "
	$iLine += 1

	$tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "<TD >(.*?)<DIV><FONT color='#AAAAAA'>.*?</FONT><DIV></TD>",2)
	$aResult = _exchange($aResult)
	$sLine &= $aResult[1] &  " | "
	$iLine += 1

	$tmpLine = FileReadLine($hFile, $iLine)
	If @error = -1 Then ExitLoop
    $aResult = StringRegExp($tmpLine, "<TD >(.*?)<DIV><FONT color='#AAAAAA'>.*?</FONT><DIV></TD>",2)
	$sLine &= $aResult[1] & @CR
	$iLine += 2
	$aString[0] += 1
	_ArrayAdd($aString,$sLine)
WEnd

For $i = 1 To UBound($aString) - 1
	FileWrite($hFile2, $aString[$i])
Next
FileClose($hFile3)
FileClose($hFile2)
FileClose($hFile)
Exit

Func _exchange($tmp1)
	$ret1 = ""
	For $i1 = 1 To StringLen($tmp1[1])
		$var = StringMid($tmp1[1], $i1, 1)
		$ret1 &= _char($var)
	Next
	$tmp1[1] = $ret1
	Return $tmp1
EndFunc

Func _char($tmp2)
	$found = 0
	For $i2 = 1 To UBound($Hiragana) - 1
		If $tmp2 = $Hiragana[$i2] Then
			$found = 1 ; совпадения найдены в хиракане - все хорошо
			$tmp2 = $Katakana[$i2]
			ExitLoop
		EndIf
		If $tmp2 = $Katakana[$i2] Then
			$found = 2 ; совпадения найдены в катакане - замена не требуется
			ExitLoop
		EndIf
	Next
	If $found = 0 Then
		MsgBox(0,"Func _char($tmp2)","Совпадений для: "&$tmp2&" небыло найдено")
		ClipPut($tmp2)
		Exit
	EndIf
	Return $tmp2
EndFunc


Теперь на выходе будет записыватся он-ое произношение иероглифа на катакане а кун-ое на хирагане, звучание на русском убраны.

Код:
朽	гнить | キュウ | くちる
杉	японский кедр | サン | すぎ
杯	бокал, кубок для сакэ | ハイ | さかずき
析	разделять | セキ | さく
枠	рама |  | わく
枢	стержень | スウ | とぼそ
枯	вянуть | コ | かれる
 
Верх