Что нового

[Данные, строки] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Alofa сказал(а):
Dk сказал(а):
... Вот ровно с этими файлами я работал. Скрин показывает совпадения со смещением.
Ну как я и думал... У меня вообще ниразу условие не сработало. Тут дело в чем-то другом :stars:
Сейчас на Win10 попробую.
Dk у вас Autoit версии какой стоит?


Добавлено:
Сообщение автоматически объединено:

Все норм.




Если честно я не знаю скачивал последнюю вроде... а где можно посмотреть. :-[ :-[ SciTe Version 3.4.1



Добавлено:
Сообщение автоматически объединено:

ildar сказал(а):
Маловато полминуты.
Код:
#Include <Log.au3>

$hLog = _Log_Open(@ScriptDir & '\MyProg.log', '#########')

_Log_Report($hLog, 'Program start', 0)
While 1
   $t1 = FileGetTime($sFile1, 0, 1)
   $t2 = FileGetTime($sFile2, 0, 1)
   _Log_Report($hLog, '$t1 = ' & $t1 & ' | ' & $t2 = ' & $t2, 3)
   Sleep(10000)
WEnd
тут только сбор лога, опрос каждые 10 сек. Прогони весь цикл, до обновления 2.txt (и когда обнуление 1.txt пройдет)

Извините я не совсем понял, что именно я должен сделать с этим скриптом? :-[
Я взял предыдущий (большой) и прогоню весь цикл.
http://files.d-lan.dp.ua/download?file=0675e695c4388c739f9ac9cce6f8c3fc
 
A

Alofa

Гость
Dk вы эти файлы без работающей программы (Давайте ее уже назовем, к примеру, "DkMonitoring.exe" :smile:) проверяли?
Там таких ASIN, как на скриншоте, вообще нет.
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Alofa сказал(а):
Dk вы эти файлы без работающей программы (Давайте ее уже назовем, к примеру, "DkMonitoring.exe" :smile:) проверяли?
Там таких ASIN, как на скриншоте, вообще нет.
Странно, наверно старый скрин взял. Проверял с работающей программой всегда.
Сделать ещё один тест и перезалить файлы и скрин?
 
A

Alofa

Гость
Re:] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Кстати о скриптах: вы мой-то отсюда брали?

А давайте-ка попробуйте прикрепленный .a3x файл.

Добавлено:
Сообщение автоматически объединено:

Dk сказал(а):
перезалить файлы и скрин?
Конечно. Только запакуйте их в архив и прикрепите к сообщению.
 

Вложения

  • MyScript.rar
    43.1 КБ · Просмотры: 5
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Alofa сказал(а):
Кстати о скриптах: вы мой-то отсюда брали?

А давайте-ка попробуйте прикрепленный .a3x файл.

Добавлено:
Сообщение автоматически объединено:

Dk сказал(а):
перезалить файлы и скрин?
Конечно. Только запакуйте их в архив и прикрепите к сообщению.


Нельзя, только как ссылка, так как больше 200 кб
Я уже спать, завтра я обязательно всё попробую

http://files.d-lan.dp.ua/download?file=99c7af4f5ac77703295fd3268e86a1fe Архивом 1,2 и Скрин

А что это принципиально должно изменить? Я имею виду a3x.
пс
Да, скрипт брал от туда.
 
A

Alofa

Гость
Re:] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Dk сказал(а):
... Архивом 1,2 и Скрин.
Все у меня штатно работает - список в GUI пуст.
Win7(x64), Autoit v3.3.12.0, SciTE v3.5.5 (от Yashied).

Вот модификация скрипта, чтобы в будущем обходиться без скриншотов:
... плюс одна ошибочка исправлена.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Dk
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>




Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Global $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'
Global $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit

$hGUI = GUICreate('Список:', 619, 175, -1, -1)
GUISetBkColor(0xB9D1EA)
$ListView = GUICtrlCreateListView('|ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 609, 125, _
        $LVS_NOSORTHEADER, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
$hButt1 = GUICtrlCreateButton('Очистить список', 100, 140, 150, 25)
$hButt2 = GUICtrlCreateButton('Выйти из программы', 350, 140, 150, 25)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewClear')
GUICtrlSetOnEvent($hButt2, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')

GUISetState(@SW_HIDE)

$sFile1 = @ScriptDir & '\1.txt'
$sFile2 = @ScriptDir & '\2.txt'

$hTimer = TimerInit()

;считываем данные из файла в массив
$aFile1 = FileReadToArray($sFile1)
$aFile2 = FileReadToArray($sFile2)

;получаем время изменения файла
$t2 =  FileGetTime($sFile2, 0, 1)

$sFile1Size = 0

$iStr = 0


While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  $sFile1Size = 0
	  Sleep(10000)
	  Else
   EndIf
   If $sFile1Size < FileGetSize($sFile1) Then
		 $aFile1 = FileReadToArray($sFile1)
		 $sFile1Size = FileGetSize($sFile1)
		 $j = UBound($aFile1)
		 If UBound($aFile1) > UBound($aFile2) Then $j = UBound($aFile2)
         For $i = 1 + $iStr To $j - 1
			$aTXT1 = StringRegExp($aFile1[$i], '"(\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)
			$aTXT2 = StringRegExp($aFile2[$i], '"(\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 $aTXT1[2] < $aTXT2[2]/2 And $aTXT1[3] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[2] & '|' & $aTXT2[2] & '|' & _
                        $aTXT1[3] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			$iStr += 1
			Else
			EndIf
		 Next
		 Else
		 EndIf
		 Sleep(100)
WEnd

Func _CLOSEClicked()
    GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL)
EndFunc

Func _ListViewClear()
    GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0)
 EndFunc

Func _Exit()
    Exit
EndFunc
Сделал по другому и добавил задержку на обновление 2.txt в 10 сек.
Пробуй.
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re: строк в столбцах в текстовом файле с разделителем - табуляция

OffTopic:

Люди добрые, сегодня буду весь день без компа... смогу всё посмотреть только вечером.
Не расходитесь :-[ :-[ :-[



Добавлено:
Сообщение автоматически объединено:

ildar сказал(а):
Dk
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>


Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Global $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'
Global $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit

$hGUI = GUICreate('Список:', 619, 175, -1, -1)
GUISetBkColor(0xB9D1EA)
$ListView = GUICtrlCreateListView('|ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 609, 125, _
        $LVS_NOSORTHEADER, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
$hButt1 = GUICtrlCreateButton('Очистить список', 100, 140, 150, 25)
$hButt2 = GUICtrlCreateButton('Выйти из программы', 350, 140, 150, 25)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewClear')
GUICtrlSetOnEvent($hButt2, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')

GUISetState(@SW_HIDE)

$sFile1 = @ScriptDir & '\1.txt'
$sFile2 = @ScriptDir & '\2.txt'

$hTimer = TimerInit()

;считываем данные из файла в массив
$aFile1 = FileReadToArray($sFile1)
$aFile2 = FileReadToArray($sFile2)

;получаем время изменения файла
$t2 =  FileGetTime($sFile2, 0, 1)

$sFile1Size = 0

$iStr = 0


While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  $sFile1Size = 0
	  Sleep(10000)
	  Else
   EndIf
   If $sFile1Size < FileGetSize($sFile1) And $t2 = FileGetTime($sFile2, 0, 1) Then
		 $aFile1 = FileReadToArray($sFile1)
		 $sFile1Size = FileGetSize($sFile1)
		 $j = UBound($aFile1)
		 If UBound($aFile1) > UBound($aFile2) Then $j = UBound($aFile2)
         For $i = 1 + $iStr To $j - 1
			$aTXT1 = StringRegExp($aFile1[$i], '"(\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)
			$aTXT2 = StringRegExp($aFile2[$i], '"(\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 $aTXT1[2] < $aTXT2[2]/2 And $aTXT1[3] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[2] & '|' & $aTXT2[2] & '|' & _
                        $aTXT1[3] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			$iStr += 1
			Else
			EndIf
		 Next
		 Else
		 EndIf
		 Sleep(100)
WEnd

Func _CLOSEClicked()
    GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL)
EndFunc

Func _ListViewClear()
    GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0)
 EndFunc

Func _Exit()
    Exit
EndFunc
Сделал по другому и добавил задержку на обновление 2.txt в 10 сек.
Пробуй.

Тоже самое. Не читает строки записанные в процессе открытия файла. Только всё, что было записанно до открытия.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
DkПоправил, проверь. (код там же, выше)
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Alofa сказал(а):
Dk сказал(а):
... Архивом 1,2 и Скрин.
Все у меня штатно работает - список в GUI пуст.
Win7(x64), Autoit v3.3.12.0, SciTE v3.5.5 (от Yashied).

Вот модификация скрипта, чтобы в будущем обходиться без скриншотов:
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Global $iCount, $asText1, $asText2, $sFile1Size, $iIndex = 0, $sFile1SizePrev = 0, $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'
Local $hGUI, $ListView, $hButt1, $hButt2, $hButt3, $hGUIState, $hExit, $sLVText

$hGUI = GUICreate('Статистика:', 635, 175, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetBkColor(0xB9D1EA)
$ListView = GUICtrlCreateListView('|ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 625, 125, _
		$LVS_NOSORTHEADER, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Opt("GUIResizeMode", $GUI_DOCKSTATEBAR)
$hButt1 = GUICtrlCreateButton('Скопировать все', 20, 140, 100, 25)
$hButt2 = GUICtrlCreateButton('Очистить список', 140, 140, 100, 25)
$hButt3 = GUICtrlCreateButton('Выйти из программы', 500, 140, 120, 25)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewCopy')
GUICtrlSetOnEvent($hButt2, '_ListViewClear')
GUICtrlSetOnEvent($hButt3, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')

#cs ===== Этот блок приостанавливает скрипт пока "1.txt" не будет очищен =====
	Do
	Sleep(250)
	$sFile1Size = FileGetSize($sFile1)
	If $sFile1SizePrev < $sFile1Size Then $sFile1SizePrev = $sFile1Size
	Until $sFile1SizePrev > $sFile1Size
	$sFile1SizePrev = 0
#ce ===========================================================================

GUISetState(@SW_HIDE)

_FilesOpen_Reads()

While 1
	While 1
		$sFile1Size = FileGetSize($sFile1)
		Select
			Case $sFile1SizePrev < $sFile1Size
				$sFile1SizePrev = $sFile1Size
			Case $sFile1SizePrev > $sFile1Size
				$sFile1SizePrev = 0
				_FilesOpen_Reads()
		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 = 0 Then ExitLoop
		Sleep(50)
	WEnd
	If $iCount >= UBound($asText2) Then ContinueLoop
	
	If $asText1[0] <> $asText2[$iCount] Then
		$iIndex = _ArraySearch($asText2, $asText1[0], $iIndex, 0, 0, 1)
		If Not @error Then $iCount = $iIndex
	EndIf
	
	If $asText1[1] <> 'N/A' And $asText2[$iCount + 2] <> 'N/A' Then
		If StringReplace($asText2[$iCount + 2], ',', '.') / StringReplace($asText1[1], ',', '.') >= 2 And $asText1[2] < 300000 Then
			$sLVItemText = '|' & $asText1[0] & '|' & $asText1[1] & '|' & $asText2[$iCount + 2] & '|' & $asText1[2] & '|' & _
					$asText2[$iCount + 1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
			GUICtrlCreateListViewItem($sLVItemText, $ListView)
			GUISetState(@SW_SHOWNORMAL)
			;SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') ; Отключил пока, для чистоты эксперимента
			$sLVText &= $sLVItemText & '|' & @CRLF
		EndIf
	EndIf

; ===== Эта строка только для тестов (не забудьте ее потом удалить)======================================
ConsoleWrite($iCount / 3 & ' (Сравниваем ASIN: ' & $asText1[0] & ' и ' & $asText2[$iCount] & ')' & @CRLF)
; =======================================================================================================
	
	$iCount += 3
WEnd

Func _FilesOpen_Reads()
	$iCount = 0
	$asText2 = 0
	If $hFile1 Then FileClose($hFile1)
	For $i = 0 To 30
		$hFile1 = FileOpen($sFile1)
		If $hFile1 <> -1 Then ExitLoop
		Sleep(90)
	Next
	If $hFile1 = -1 Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "1.txt".')
	For $i = 0 To 30
		$asText2 = StringRegExp(FileRead($sFile2), '\n"(\w{10,12})"\t"(.+?)"(?:\t[\d\,N/A]+?)\t([\d\,N/A]+)\t.+', 3)
		If Not @error Then Return
		Sleep(90)
	Next
	MsgBox(16, 'Ошибка!', 'Не удалось открыть или корректно прочитать "2.txt".')
	_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($ListView, $LVM_DELETEALLITEMS, 0, 0)
	$sLVText = ''
EndFunc   ;==>_ListViewClear

Func _Exit()
	If $hFile1 Then FileClose($hFile1)
	Exit
EndFunc   ;==>_Exit
... плюс одна ошибочка исправлена.

Я нашёл место где именно начинает неправильно работать скрипт.
Вообщем смысл такой.

Когда скрипт делаетпервый круг (тоесть старт без обновления файла), то он работает отлично. Выдаёт всё правильно. Когда заходит на второй круг происходит смещение строк.

Привожу пример

1) Первый круг нормально
2) второй круг файл обновился, скрипт пошёл на второй круг -пошли смещения, как результат много якобы совпадений.
3) Я не дожидаясь обновления файла выключаю скрипт и сразу же включаю, он быстро прочитывает всё заново (ровно то что было на втором круге, так как файлы не обновились ещё) и не выдаёт неправильные совпадения, как на втором круге. Работает опять корректно.

Ошибка значит не в регулярных ворожения - не в разделителях. А' в повторном заходе на проверку'.
 
A

Alofa

Гость
Re:] Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Dk сказал(а):
Ошибка значит не в регулярных ворожения - не в разделителях. А' в повторном заходе на проверку'.
Да это-то понятно, что не в регулярном выражении - у нас ведь с ildar фактически оно одно на двоих. :D



Добавлено:
Сообщение автоматически объединено:
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:

ildar сказал(а):
DkПоправил, проверь. (код там же, выше)

В вашем скрипте смещение строк.
Всё берёт верно кроме старой цены. Старую цену берёт от другого продукта и из за этого ложные совпадения. (И так же не читает новые строки)


Добавлено:
Сообщение автоматически объединено:

У меня маленькое предложение.
Может проще будет написать скрипт, kоторый бы просто эмитировал бы мою программу? ?

Пусть скрипт построчно записывает в файл 1.тхт (20 сток в секунду) из файла 2. тхт, так же в цыкле (строки пусть буду одинаковыми). Как условие для совпадения поставить знак равно. И мне кажется каждому будет наглядно видно как ведёт себя скрипт. :whistle:
 
A

Alofa

Гость
Re:

Dk сказал(а):
...Может проще будет написать скрипт, kоторый бы просто эмитировал бы мою программу?
Э неее :naughty:
А как же поучаствовать в процессе? :rofl:
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re:

Alofa сказал(а):
Dk сказал(а):
...Может проще будет написать скрипт, kоторый бы просто эмитировал бы мою программу?
Э неее :naughty:
А как же поучаствовать в процессе? :rofl:

OffTopic:
Да нет. Я то не против. Вы меня не так поняли. Просто выглядит так, что вы делаете, а мне всё не то да не то 8)
 
A

Alofa

Гость
OffTopic:
Dk это была шутка. Если бы мне не был интересен результат, давно бы спрыгнул.


Вот пробуйте:
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Local $sFile2GTime, $iCount, $asText1, $asText2, $sFile1Size, $hGUI, $hListView, $nCh1, $hButt1, $hButt2, $hButt3, $hButt4, $hGUIState, $hExit, $sLVText
Local $sFile1SizePrev = 0, $iIndex = 0, $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'

$hGUI = GUICreate('Статистика:', 635, 210, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetBkColor(0xB9D1EA)
$hListView = GUICtrlCreateListView('ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 625, 170, _
		$LVS_NOSORTHEADER, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Opt("GUIResizeMode", $GUI_DOCKSTATEBAR)
$nCh1 = GUICtrlCreateCheckbox('Автоотправка Email', 255, 183, 120, 20)
$hButt1 = GUICtrlCreateButton('Скопировать все', 10, 180, 100, 25)
$hButt2 = GUICtrlCreateButton('Отправить Email', 130, 180, 100, 25)
$hButt3 = GUICtrlCreateButton('Очистить список', 390, 183, 100, 20)
$hButt4 = GUICtrlCreateButton('Выйти из программы', 510, 183, 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')

#cs ===== Этот блок приостанавливает скрипт пока "1.txt" не будет очищен =====
	Do
	Sleep(250)
	$sFile1Size = FileGetSize($sFile1)
	If $sFile1SizePrev < $sFile1Size Then $sFile1SizePrev = $sFile1Size
	Until $sFile1SizePrev > $sFile1Size
	$sFile1SizePrev = 0
#ce ===========================================================================

GUISetState(@SW_HIDE)

$sFile2GTime = 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 = 0 Then ExitLoop
		Sleep(50)
	WEnd
	If $iCount >= UBound($asText2) Then ContinueLoop
	
	If $asText1[0] <> $asText2[$iCount] Then
		$iIndex = _ArraySearch($asText2, $asText1[0], $iIndex, 0, 0, 1)
		If Not @error Then $iCount = $iIndex
	EndIf
	
	If $asText1[1] <> 'N/A' And $asText2[$iCount + 2] <> 'N/A' Then
		If StringReplace($asText2[$iCount + 2], ',', '.') / StringReplace($asText1[1], ',', '.') >= 2 And $asText1[2] < 300000 Then
			$sLVItemText = $asText1[0] & '|' & $asText1[1] & '|' & $asText2[$iCount + 2] & '|' & $asText1[2] & '|' & _
					$asText2[$iCount + 1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
			GUICtrlCreateListViewItem($sLVItemText, $hListView)
			GUISetState(@SW_SHOWNORMAL)
			;SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') ; Отключил пока, для чистоты эксперимента
			$sLVText &= $sLVItemText & '|' & @CRLF
		EndIf
	EndIf

	; ===== Эта строка только для тестов (не забудьте ее потом удалить)======================================
	ConsoleWrite($iCount / 3 & ' (Сравниваем ASIN: ' & $asText1[0] & ' и ' & $asText2[$iCount] & ')' & @CRLF)
	; =======================================================================================================
	
	$iCount += 3
WEnd

Func _FilesOpen_Reads($iFirstStart)
	Local $sF2GT, $i = 0
	$iCount = 0
	$asText2 = 0
	If Not $iFirstStart Then
		FileClose($hFile1)
		While 1
			$i += 1
			$sF2GT = FileGetTime($sFile2, 0, 1)
			If $sF2GT > $sFile2GTime Then
				$sFile2GTime = $sF2GT
				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".')
	For $i = 0 To 30
		$asText2 = StringRegExp(FileRead($sFile2), '\n"(\w{10,12})"\t"(.+?)"(?:\t[\d\,N/A]+?)\t([\d\,N/A]+)\t.+', 3)
		If Not @error Then Return
		Sleep(100)
	Next
	MsgBox(16, 'Ошибка!', 'Не удалось открыть или корректно прочитать файл "2.txt".')
	_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
Добавил в скрипт процедуру проверки обновления "2.txt" в течении 6 секунд.

Если те же вилы, то добавьте:
Код:
Func _FilesOpen_Reads($iFirstStart)
	Sleep(10000) ; простой 10 сек. (до выяснения обстоятельств)
    Local $sF2GT, $i = 0
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re: Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Alofa сказал(а):
OffTopic:
Dk это была шутка. Если бы мне не был интересен результат, давно бы спрыгнул.


Вот пробуйте:
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Local $sFile2GTime, $iCount, $asText1, $asText2, $sFile1Size, $hGUI, $ListView, $hButt1, $hButt2, $hButt3, $hGUIState, $hExit, $sLVText
Local $sFile1SizePrev = 0, $iIndex = 0, $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'

$hGUI = GUICreate('Статистика:', 635, 175, -1, -1, $WS_OVERLAPPEDWINDOW)
GUISetBkColor(0xB9D1EA)
$ListView = GUICtrlCreateListView('|ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 625, 125, _
		$LVS_NOSORTHEADER, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
Opt("GUIResizeMode", $GUI_DOCKSTATEBAR)
$hButt1 = GUICtrlCreateButton('Скопировать все', 20, 140, 100, 25)
$hButt2 = GUICtrlCreateButton('Очистить список', 140, 140, 100, 25)
$hButt3 = GUICtrlCreateButton('Выйти из программы', 500, 140, 120, 25)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewCopy')
GUICtrlSetOnEvent($hButt2, '_ListViewClear')
GUICtrlSetOnEvent($hButt3, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')

#cs ===== Этот блок приостанавливает скрипт пока "1.txt" не будет очищен =====
	Do
	Sleep(250)
	$sFile1Size = FileGetSize($sFile1)
	If $sFile1SizePrev < $sFile1Size Then $sFile1SizePrev = $sFile1Size
	Until $sFile1SizePrev > $sFile1Size
	$sFile1SizePrev = 0
#ce ===========================================================================

GUISetState(@SW_HIDE)

$sFile2GTime = 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 = 0 Then ExitLoop
		Sleep(50)
	WEnd
	If $iCount >= UBound($asText2) Then ContinueLoop
	
	If $asText1[0] <> $asText2[$iCount] Then
		$iIndex = _ArraySearch($asText2, $asText1[0], $iIndex, 0, 0, 1)
		If Not @error Then $iCount = $iIndex
	EndIf
	
	If $asText1[1] <> 'N/A' And $asText2[$iCount + 2] <> 'N/A' Then
		If StringReplace($asText2[$iCount + 2], ',', '.') / StringReplace($asText1[1], ',', '.') >= 2 And $asText1[2] < 300000 Then
			$sLVItemText = '|' & $asText1[0] & '|' & $asText1[1] & '|' & $asText2[$iCount + 2] & '|' & $asText1[2] & '|' & _
					$asText2[$iCount + 1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
			GUICtrlCreateListViewItem($sLVItemText, $ListView)
			GUISetState(@SW_SHOWNORMAL)
			;SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') ; Отключил пока, для чистоты эксперимента
			$sLVText &= $sLVItemText & '|' & @CRLF
		EndIf
	EndIf

	; ===== Эта строка только для тестов (не забудьте ее потом удалить)======================================
	ConsoleWrite($iCount / 3 & ' (Сравниваем ASIN: ' & $asText1[0] & ' и ' & $asText2[$iCount] & ')' & @CRLF)
	; =======================================================================================================
	
	$iCount += 3
WEnd

Func _FilesOpen_Reads($iFirstStart)
	Local $i = 0
	$iCount = 0
	$asText2 = 0
	If Not $iFirstStart Then
		FileClose($hFile1)
		While $sFile2GTime = FileGetTime($sFile2, 0, 1)
			$i += 1
			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".')
	For $i = 0 To 30
		$asText2 = StringRegExp(FileRead($sFile2), '\n"(\w{10,12})"\t"(.+?)"(?:\t[\d\,N/A]+?)\t([\d\,N/A]+)\t.+', 3)
		If Not @error Then Return
		Sleep(100)
	Next
	MsgBox(16, 'Ошибка!', 'Не удалось открыть или корректно прочитать файл "2.txt".')
	_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($ListView, $LVM_DELETEALLITEMS, 0, 0)
	$sLVText = ''
EndFunc   ;==>_ListViewClear

Func _Exit()
	If $hFile1 Then FileClose($hFile1)
	Exit
EndFunc   ;==>_Exit
Добавил в скрипт процедуру проверки обновления "2.txt" в течении 6 секунд.
Если те же вилы, то добавьте:
Код:
Func _FilesOpen_Reads($iFirstStart)
	Sleep(10000) ; простой 10 сек. (до выяснения обстоятельств)
	Local $i = 0


Скриптуличка пошла уже на третий заход, сбоев нет!) :laugh:
Ну я пока торопиться не буду, подожду ещё, завтра окончательно скажу :-X :-[ :-[
 
A

Alofa

Гость
Re: Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Dk сказал(а):

Значит это неправда
Dk сказал(а):
... начинается обновление файла 2.тхт оно длится около 3-5 секунд и только потом обнуляется файл 1.тхт.


Добавлено:
Сообщение автоматически объединено:

Dk обратите внимание - Обновил Скрипт (пользуйте его).
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Dk
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>




Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Global $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'
Global $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit

$hGUI = GUICreate('Список:', 619, 175, -1, -1)
GUISetBkColor(0xB9D1EA)
$ListView = GUICtrlCreateListView('|ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 609, 125, _
        $LVS_NOSORTHEADER, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
$hButt1 = GUICtrlCreateButton('Очистить список', 100, 140, 150, 25)
$hButt2 = GUICtrlCreateButton('Выйти из программы', 350, 140, 150, 25)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewClear')
GUICtrlSetOnEvent($hButt2, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')

GUISetState(@SW_HIDE)

$sFile1 = @ScriptDir & '\1.txt'
$sFile2 = @ScriptDir & '\2.txt'

$hTimer = TimerInit()

;считываем данные из файла в массив

$aFile2 = FileReadToArray($sFile2)

;получаем размер массива
$iSizeFile1 = 0
$iSizeFile2 = UBound($aFile2)

$iStr = 0


While 1
   $aFile1 = FileReadToArray($sFile1)
   If $iSizeFile1 < UBound($aFile1) Then
		 $iSizeFile1 = UBound($aFile1)
         For $i = 1 + $iStr To $iSizeFile1 - 1
			$aTXT1 = StringRegExp($aFile1[$i], '"(\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)
			$aTXT2 = StringRegExp($aFile2[$i], '"(\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 $aTXT1[2] < $aTXT2[2]/2 And $aTXT1[3] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[2] & '|' & $aTXT2[2] & '|' & _
                        $aTXT1[3] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			$iStr += 1
			Else
			EndIf
		 Next
		 Else
		 EndIf
   If $iSizeFile1 = $iSizeFile2 Then
	  $iSizeFile1 = 0
	  $Str = 0
	  Sleep(10000)
	  $aFile2 = FileReadToArray($sFile2)
	  Else
		 Sleep(1000)
   EndIf
WEnd

Func _CLOSEClicked()
    GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL)
EndFunc

Func _ListViewClear()
    GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0)
 EndFunc

Func _Exit()
    Exit
EndFunc
Переделал. Теперь скрипт не мониторит время изменения файла или изменение размера, а ориентируется на изменение массива.
 
Автор
D

Dk

Новичок
Сообщения
358
Репутация
2
Re: Сравнение строк в столбцах в текстовом файле с разделителем - табуляция

Происходит смещение и у Ildara и у Alofa. (старые цены берутся непонятно откуда ).
У меня сейчас нет времени отслеживать несколько часов.
Ildar, новые строки читаются.

Всё же я предлагаю сделать скрипт, который бы эмитировал мою программу. Иначе так ничего не выйдет.

Либо как я уже говорил ранее, пусть ексел переделывает разделители в точку с запятой, записывает в новый файл и его уже читает ваш скрипт. С разделителями ; уж точно никаких проблем быть не должно.


Alofa, Ildar

Возьмите те примеры, которые я вам дал, где показывает ошибка и проверьте их ещё раз. У вас ничего не показывало, потому что у вас стоит условие в два раза меньше, а вы поставте, условие просто меньше, или меньше на единицу. Тогда у вас будет, гораздо больше примеров для наглядности.
У вас не выдаёт ошибок, потому что УСЛОВИЯ слишком завышенные, под них просто не попадают даже смещённые ценны, вот вы и не видите. А поставьте просто Новая цена должна быть меньше старой. Или другое условие более результативное и тогда будет всё видно.

Давайте ориентироваться на:
Новая цена < Старая цена - 1 и Rang < 9000000
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>




Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 3)

Global $sFile1 = @ScriptDir & '\1.txt', $hFile1, $sFile2 = @ScriptDir & '\2.txt'
Global $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit

$hGUI = GUICreate('Список:', 619, 175, -1, -1)
GUISetBkColor(0xB9D1EA)
$ListView = GUICtrlCreateListView('|ASIN-10  |Price[New]|Price[Old]|SalesRank|Name|Date & Time', 5, 5, 609, 125, _
        $LVS_NOSORTHEADER, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES, $LVS_EX_HEADERDRAGDROP))
$hButt1 = GUICtrlCreateButton('Очистить список', 100, 140, 150, 25)
$hButt2 = GUICtrlCreateButton('Выйти из программы', 350, 140, 150, 25)
$hGUIState = TrayCreateItem('Отобразить/Скрыть Окно')
TrayCreateItem('')
$hExit = TrayCreateItem('Выход')
GUISetOnEvent($GUI_EVENT_CLOSE, '_CLOSEClicked')
GUICtrlSetOnEvent($hButt1, '_ListViewClear')
GUICtrlSetOnEvent($hButt2, '_Exit')
TrayItemSetOnEvent($hGUIState, '_CLOSEClicked')
TrayItemSetOnEvent($hExit, '_Exit')

GUISetState(@SW_HIDE)

$sFile1 = @ScriptDir & '\1.txt'
$sFile2 = @ScriptDir & '\2.txt'

$hTimer = TimerInit()

;считываем данные из файла в массив

$aFile2 = FileReadToArray($sFile2)

;получаем размер массива
$iSizeFile1 = 0
$iSizeFile2 = UBound($aFile2)

$iStr = 0


While 1
   $aFile1 = FileReadToArray($sFile1)
   If $iSizeFile1 < UBound($aFile1) Then
		 $iSizeFile1 = UBound($aFile1)
         For $i = 1 + $iStr To $iSizeFile1 - 1
			$aTXT1 = StringSplit($aFile1[$iStr], @TAB, 2)
			$aTXT2 = StringSplit($aFile2[$iStr], @TAB, 2)
			If $aTXT1[2] < $aTXT2[2]/2 And $aTXT1[9] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[2] & '|' & $aTXT2[2] & '|' & _
                        $aTXT1[9] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			$iStr += 1
			Else
			EndIf
		 Next
		 Else
		 EndIf
   If $iSizeFile1 = $iSizeFile2 Then
	  $iSizeFile1 = 0
	  $Str = 0
	  Sleep(10000)
	  $aFile2 = FileReadToArray($sFile2)
	  Else
		 Sleep(1000)
   EndIf
WEnd

Func _CLOSEClicked()
    GUISetState(BitAND(WinGetState($hGUI), 2) ? @SW_HIDE : @SW_SHOWNORMAL)
EndFunc

Func _ListViewClear()
    GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0)
 EndFunc

Func _Exit()
    Exit
EndFunc
Изменил. Пробовал ставить равно в условии, смещение не обнаружил.
 
Верх