#include <Excel.au3>
;функции _Excel* без проверок на ошибки
$iList = 1
$iNew = 0
$sFile = @ScriptDir & '\Test'
$sFileTemp = @ScriptDir & '\Temp'
$oExcel = _ExcelBookOpen($sFile & '.xls', 0)
_ExcelSheetActivate($oExcel, $iList)
_ExcelBookSaveAs($oExcel, $sFileTemp, 'txt', 0, 1)
_ExcelBookClose($oExcel, 0)
$oExcel = 0
$sText = FileRead($sFileTemp & '.txt')
$aFirst = StringRegExp($sText, '(?m)^(.+)\t', 3)
If @error Then Exit -1
$aSecond = StringRegExp($sText, '(?m)\t(.+)(?:\t|\r)', 3)
If @error Then Exit -2
$sText = ''
;$iSt = TimerInit()
$aFirstNew = _Del_1DArrayFrom_1DArray($aSecond, $aFirst)
If @error Then Exit -3
;ConsoleWrite(StringFormat('%.2f msec', TimerDiff($iSt)) & @LF)
;$iSt = TimerInit()
$aSecondNew = _Del_1DArrayFrom_1DArray($aFirst, $aSecond)
If @error Then Exit -4
;ConsoleWrite(StringFormat('%.2f msec', TimerDiff($iSt)) & @LF)
If $aFirstNew[0] > $aSecondNew[0] Then
$iEnd = $aSecondNew[0]
$iNew = 1
ElseIf $aFirstNew[0] < $aSecondNew[0] Then
$iEnd = $aFirstNew[0]
$iNew = 2
Else
$iEnd = $aFirstNew[0]
EndIf
For $i = 1 To $iEnd
$sText &= $aFirstNew[$i] & @TAB & $aSecondNew[$i] & @CRLF
Next
Switch $iNew
Case 1
For $i = $iEnd + 1 To $aFirstNew[0]
$sText &= $aFirstNew[$i] & @TAB & @CRLF
Next
Case 2
For $i = $iEnd + 1 To $aSecondNew[0]
$sText &= @TAB & $aSecondNew[$i] & @CRLF
Next
EndSwitch
$hFile = FileOpen($sFileTemp & '.txt', 2)
FileWrite($hFile, $sText)
FileClose($hFile)
$oExcel = _ExcelBookOpen($sFileTemp & '.txt', 0)
_ExcelBookSaveAs($oExcel, $sFileTemp, 'xls', 0, 1)
_ExcelBookClose($oExcel, 0)
FileDelete($sFileTemp & '.txt')
#cs
идея в этой теме: http://autoit-script.ru/index.php/topic,2930.0.html
Вернет одномерный массив $a_Ret, в котором из одномерного массива $a_Where удалены все элементы,
совпадающие с элементами одномерного массива $a_What.
$a_Ret[0] - кол-во несовпадающих элементов
(пока нет времени дописывать обработку 2-х мерных массивов)
$f_Casesense = False - не учитывается регистр
$f_Casesense = True - учитывается регистр
#ce
Func _Del_1DArrayFrom_1DArray($a_What, $a_Where, $i_StartWhat = 0, $i_StartWhere = 0, $f_Casesense = False)
Local $i_1DWhat, $i_1DWhere, $a_Ret[1] = [0], $s_Un = '/|\'
If UBound($a_What, 0) <> 1 Then Return SetError(1, 0, -1)
If UBound($a_Where, 0) <> 1 Then Return SetError(1, 0, -1)
$i_1DWhat = UBound($a_What)
$i_1DWhere = UBound($a_Where)
If $i_1DWhat - $i_StartWhat < 1 Then Return SetError(2, 0, -1)
If $i_1DWhere - $i_StartWhere < 1 Then Return SetError(2, 0, -1)
If $f_Casesense Then
For $i = $i_StartWhat To $i_1DWhat - 1
Assign(Binary($a_What[$i] & $s_Un), 0)
Next
Else
For $i = $i_StartWhat To $i_1DWhat - 1
Assign($a_What[$i] & $s_Un, 0)
Next
EndIf
ReDim $a_Ret[$i_1DWhere + 1]
If $f_Casesense Then
For $i = $i_StartWhere To $i_1DWhere - 1
If IsDeclared(Binary($a_Where[$i] & $s_Un)) Then ContinueLoop
$a_Ret[0] += 1
$a_Ret[$a_Ret[0]] = $a_Where[$i]
Next
Else
For $i = $i_StartWhere To $i_1DWhere - 1
If IsDeclared($a_Where[$i] & $s_Un) Then ContinueLoop
$a_Ret[0] += 1
$a_Ret[$a_Ret[0]] = $a_Where[$i]
Next
EndIf
ReDim $a_Ret[$a_Ret[0] + 1]
Return $a_Ret
EndFunc ;==>_Del_1DArrayFrom_1DArray