A
Alofa
Гость
Re: [Данные, строки] Re: Сравнение строк в столбцах в текстовом файле с разделителем - табуляция
Добавлено:
Доработанный Вариант №1
Он скоростней, но уступает Варианту №2.
К примеру с одними и теми же файлами Вариант №1 справился за 33.5 сек., Вариант №2 за 1.62 сек., а этот за 9.88 сек.
Вот сижу и думаю, на каком остановиться?
Уже нет.Dk сказал(а):Ошибка ...
Добавлено:
Сообщение автоматически объединено:
Доработанный Вариант №1
Код:
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)
Local $iFile2GTime, $asText1, $asText2, $sText2, $sFile1Size, $hGUI, $hListView, $nCh1, $hButt1, $hButt2, $hButt3, $hButt4, $hGUIState, $hExit, $sLVText
Local $sFile1SizePrev = 0, $iOffset = 1, $hFile1, $sFile1 = @ScriptDir & '\1.txt', $sFile2 = @ScriptDir & '\2.txt'
$hGUI = GUICreate('Статистика:', 635, 280, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetBkColor(0xB9D1EA)
$hListView = GUICtrlCreateListView('ASIN-10 |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 625, 240, _
$LVS_NOSORTHEADER, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Opt("GUIResizeMode", $GUI_DOCKSTATEBAR)
$nCh1 = GUICtrlCreateCheckbox('Автоотправка Email', 255, 253, 120, 20)
$hButt1 = GUICtrlCreateButton('Скопировать все', 10, 250, 100, 25)
$hButt2 = GUICtrlCreateButton('Отправить Email', 130, 250, 100, 25)
$hButt3 = GUICtrlCreateButton('Очистить список', 390, 253, 100, 20)
$hButt4 = GUICtrlCreateButton('Выйти из программы', 510, 253, 120, 20)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewCopy')
GUICtrlSetOnEvent($hButt3, '_ListViewClear')
GUICtrlSetOnEvent($hButt4, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')
GUISetState(@SW_HIDE)
$iFile2GTime = FileGetTime($sFile2, 0, 1)
_FilesOpen_Reads(1)
While 1
While 1
$sFile1Size = FileGetSize($sFile1)
Select
Case $sFile1SizePrev < $sFile1Size
$sFile1SizePrev = $sFile1Size
Case $sFile1SizePrev > $sFile1Size
$sFile1SizePrev = 0
_FilesOpen_Reads(0)
EndSelect
$asText1 = StringRegExp(FileReadLine($hFile1), '^"(\w{10,12})"\t"(?:.+?)"(?:\t[\d\,N/A]+)\t([\d\,N/A]+)(?:\t[\d\,N/A]+\t.+?"?)(?:\t[\d\,N/A]+){3}\t([\d\,N/A]+)\t', 3)
If @error Then
Sleep(50)
ContinueLoop
EndIf
For $i = 0 To 1
$asText2 = StringRegExp($sText2, '\v' & $asText1[0] & '\|([\d\,N/A]+)\|(.+?)\|', 1, $iOffset)
If @error Then
$iOffset = 1
Else
$iOffset = @extended
ExitLoop 2
EndIf
Next
If @error Then ContinueLoop
WEnd
If $asText1[1] <> 'N/A' And $asText2[0] <> 'N/A' Then
;~ If Number(StringReplace($asText2[0], ',', '.')) / Number(StringReplace($asText1[1], ',', '.')) >= 2 And Number($asText1[2]) < 300000 Then
If Number(StringReplace($asText2[0], ',', '.')) > Number(StringReplace($asText1[1], ',', '.')) And Number($asText1[2]) < 30000000 Then
$sLVItemText = $asText1[0] & '|' & $asText1[1] & '|' & $asText2[0] & '|' & $asText1[2] & '|' & _
$asText2[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
GUICtrlCreateListViewItem($sLVItemText, $hListView)
GUISetState(@SW_SHOWNORMAL)
;SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') ; Отключил пока, для чистоты эксперимента
$sLVText &= $sLVItemText & '|' & @CRLF
EndIf
EndIf
WEnd
Func _FilesOpen_Reads($iFirstStart)
Local $iF2GT, $i = 0
$sText2 = ''
If Not $iFirstStart Then
FileClose($hFile1)
While 1
$i += 1
$iF2GT = FileGetTime($sFile2, 0, 1)
If $iF2GT > $iFile2GTime Then
$iFile2GTime = $iF2GT
ExitLoop
EndIf
If $i >= 60 Then Exit MsgBox(16, 'Ошибка!', 'Файл "2.txt" не обновился.' & @LF & 'Программа будет закрыта.')
Sleep(100)
WEnd
EndIf
For $i = 0 To 30
$hFile1 = FileOpen($sFile1)
If $hFile1 <> -1 Then ExitLoop
Sleep(100)
Next
If $hFile1 = -1 Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "1.txt".' & @LF & 'Программа будет закрыта.')
For $i = 0 To 30
$sText2 = StringRegExpReplace(FileRead($sFile2), '\n"(\w{10,12})"\t"(.+?)"(?:\t[\d\,N/A]+?)\t([\d\,N/A]+)\t.+', '${1}|${3}|${2}|')
If Not @error Then Return
Sleep(100)
Next
MsgBox(16, 'Ошибка!', 'Не удалось открыть или прочитать файл "2.txt".' & @LF & 'Программа будет закрыта.')
_Exit()
EndFunc ;==>_FilesOpen_Reads
Func _CLOSEClicked()
GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL)
EndFunc ;==>_CLOSEClicked
Func _ListViewCopy()
ClipPut($sLVText)
EndFunc ;==>_ListViewCopy
Func _ListViewClear()
GUICtrlSendMsg($hListView, $LVM_DELETEALLITEMS, 0, 0)
$sLVText = ''
EndFunc ;==>_ListViewClear
Func _Exit()
If $hFile1 Then FileClose($hFile1)
Exit
EndFunc ;==>_Exit
К примеру с одними и теми же файлами Вариант №1 справился за 33.5 сек., Вариант №2 за 1.62 сек., а этот за 9.88 сек.
Вот сижу и думаю, на каком остановиться?