Что нового

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

A

Alofa

Гость
Dk что ни пост - то новые факты.
Поменял скрипт в Ответе #54. Тестируйте.

OffTopic:
Dk сказал(а):
...Либо сейчас или уже завтра начну тестить скрипт Ildara.
Вы разве этого еще не сделали? Человек-то старался.
 
Автор
D

Dk

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

Alofa
(59) : ==> Unknown function name.:
$iIndex = _ArraySearch($asText2, $asText1[0], 0, 0, 0, 1)
$iIndex = ^ ERROR

:'(


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


OffTopic:
Dk сказал(а):
...Либо сейчас или уже завтра начну тестить скрипт Ildara.
Вы разве этого еще не сделали? Человек-то старался.

OffTopic:

Разумеется я обязательно протестирую скрипт Ildara, всё по очереди. Слишком много времени нужно, что бы проверить каждый вариант + не всегда в интернете нахожусь.
Вы первый выложили, Вас и тестирую. Но я обязательно это сделаю.
 
A

Alofa

Гость
OffTopic:
Эх, думал, не успеете увидеть недообновленный пост - а успели. :whistle: Пересмотрите его сейчас.
 
Автор
D

Dk

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

Alofa сказал(а):
OffTopic:
Эх, думал, не успеете увидеть недообновленный пост - а успели. :whistle: Пересмотрите его сейчас.


Теперь рабоатет нормально, но есть следущая ошибка.

1)ASIN, Newprice и ранг берутся с одной строки (один товар), а Oldprice и имя с другой строки (второй товар). Получается выдаёт совпадение смешивая параметры 2-ух товаров. Где то смещение строк. Скрипт сравнивает одну строку с файла 1.тхт с другой строкой, которая не на тoм же месте в файла 2. тхт :'(

2)И если NewPrice = N/A, то тоже высвечивается как совпадение, хотя должно не показывать. Наверно тоже каким то образом связанно со смещением.

3)Когда программа пошла на тритий круг, то скрип одну строку пропустил и было всегда на 1 меньше. Пример программа 100 -скрипт 99, программа 250 скрипт 249.
Думаю дальше будет всегда сбиваться на строчку и будет разница в 2 строки.
 

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()

;считываем данные из файла в массив
$aFile1 = FileReadToArray($sFile1)
$aFile2 = FileReadToArray($sFile2)
;_ArrayDisplay($aFile2)
;получаем время изменения файла
$t1 =  FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  Else
   EndIf
   If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1) Then
		 $aFile1 = FileReadToArray($sFile1)
		 $t1 =  FileGetTime($sFile1, 0, 1)
		 For $i = 1 + $iStr To UBound($aFile1) - 1
			$aTXT1 = StringSplit($aFile1[$i], @TAB, 2)
			$aTXT2 = StringSplit($aFile2[$i], @TAB, 2)
			If $aTXT1[3] < $aTXT2[3]/2 And $aTXT1[9] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[3] & '|' & $aTXT2[3] & '|' & _
                        $aTXT1[2] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			$iStr += 1
			Else
			EndIf
		 Next
		 Else
   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
Dk Нужно тестить.
С GUI не дружу, поэтому использовал из кода Alofa(надеюсь не будет бить ногами). Можно и почту прикрутить, но это потом.
 
A

Alofa

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

OffTopic:
Dk сказал(а):
...Теперь рабоатет нормально, но есть следущая ошибка...
Выдающаяся фраза :suicide:

Тут нужно бумажно подумать :scratch:


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

ildar сказал(а):
... С GUI не дружу, поэтому использовал из кода Alofa(надеюсь не будет бить ногами).
Нормально. А я вот с отправкой Email не дружу.
 
Автор
D

Dk

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

Alofa

Всё равно происходит смещение.
Самый первый Ваш скрипт такой ошибки не имел с тем же файлом. Всё проверяю с одним и тем же файлам 2.тхт.
Файл 2.тхт выложен в посте 51.



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

ildar сказал(а):
Код:
#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)
;_ArrayDisplay($aFile2)
;получаем время изменения файла
$t1 =  FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  Else
   EndIf
   If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1) Then
		 $aFile1 = FileReadToArray($sFile1)
		 $t1 =  FileGetTime($sFile1, 0, 1)
		 For $i = 1 + $iStr To UBound($aFile1) - 1
			$aTXT1 = StringSplit($aFile1[$i], @TAB, 2)
			$aTXT2 = StringSplit($aFile2[$i], @TAB, 2)
			If $aTXT1[3] < $aTXT2[3]/2 And $aTXT1[9] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[3] & '|' & $aTXT2[3] & '|' & _
                        $aTXT1[2] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			$iStr += 1
			Else
			EndIf
		 Next
		 Else
   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
Dk Нужно тестить.


К сожалению работает не корректно. Впустую перебирает строки - летит в низ без остановки. В файл строки не дописываются, а он всё равно молотит. :'(
 

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()

;считываем данные из файла в массив
$aFile1 = FileReadToArray($sFile1)
$aFile2 = FileReadToArray($sFile2)
;_ArrayDisplay($aFile2)
;получаем время изменения файла
$t1 =  FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  ;MsgBox(0, 'Первое условие', 'Сработало 1')
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  Else
   EndIf
   If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1) Then
		 ;MsgBox(0, 'Второе условие', 'Сработало 2')
		 $aFile1 = FileReadToArray($sFile1)
		 $t1 =  FileGetTime($sFile1, 0, 1)
		 For $i = 1 + $iStr To UBound($aFile1) - 1
			$aTXT1 = StringSplit($aFile1[$i], @TAB, 2)
			$aTXT2 = StringSplit($aFile2[$i], @TAB, 2)
			If $aTXT1[3] < $aTXT2[3]/2 And $aTXT1[9] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[3] & '|' & $aTXT2[3] & '|' & _
                        $aTXT1[2] & '|' & $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
Молотит - добавил sleep в цикле (недоглядел)
Условия отрабатывают корректно. Если файлы не изменены, то ничего не происходит. Менял значения вручную в файле 1.txt , после сохранения сразу выдавал результат.
Тут почта прикручена
Код:
#include <Array.au3>
#include <WindowsConstants.au3>
#include <ListViewConstants.au3>
#include <GUIConstantsEx.au3>
#include<file.au3>

;##################################
; Variables
;##################################
$SmtpServer = "smtp.mail.ru"								; адрес smtp-сервера вашей эл. почты
$FromName = "Иван Жуков"									; ваше имя
$FromAddress = "[email protected]"								; ваш почтовый адрес
$ToAddress = "На деревню дедушке.... Константину Макарычу"	; адрес получателя
$Subject = "Милый дедушка, Константин Макарыч!"				; тема
$Body = "Христом богом тебя молю, возьми меня отседа."		; содержание
$AttachFiles = ""
$CcAddress = ""
$BccAddress = ""
$Importance = "Normal"
$Username = ""												; логин
$Password = ""												; пароль
$IPPort = 25
$ssl = 0



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

Global $oMyRet[2]
Global $oMyError = ObjEvent("AutoIt.Error", "MyErrFunc")
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)
;_ArrayDisplay($aFile2)
;получаем время изменения файла
$t1 =  FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  Else
   EndIf
   If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1) Then
		 $aFile1 = FileReadToArray($sFile1)
		 $t1 =  FileGetTime($sFile1, 0, 1)
		 For $i = 1 + $iStr To UBound($aFile1) - 1
			$aTXT1 = StringSplit($aFile1[$i], @TAB, 2)
			$aTXT2 = StringSplit($aFile2[$i], @TAB, 2)
			If $aTXT1[3] < $aTXT2[3]/2 And $aTXT1[9] < 300000 Then
			   GUICtrlCreateListViewItem('|' & $aTXT1[0] & '|' & $aTXT1[3] & '|' & $aTXT2[3] & '|' & _
                        $aTXT1[2] & '|' & $aTXT1[1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
               GUISetState(@SW_SHOWNORMAL)
			   ; отправка письма
			   $Subject = $aTXT1[0]
			   $Body = $aTXT1[0] & '|' & $aTXT1[3] & '|' & $aTXT2[3]
			   $rc = _INetSmtpMailCom($SmtpServer, $FromName, $FromAddress, $ToAddress, $Subject, $Body, $AttachFiles, $CcAddress, $BccAddress, $Importance, $Username, $Password, $IPPort, $ssl)
			$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

 ; The UDF
Func _INetSmtpMailCom($s_SmtpServer, $s_FromName, $s_FromAddress, $s_ToAddress, $s_Subject = "", $as_Body = "", $s_AttachFiles = "", $s_CcAddress = "", $s_BccAddress = "", $s_Importance="Normal", $s_Username = "", $s_Password = "", $IPPort = 25, $ssl = 0)
    Local $objEmail = ObjCreate("CDO.Message")
    $objEmail.From = '"' & $s_FromName & '" <' & $s_FromAddress & '>'
    $objEmail.To = $s_ToAddress
    Local $i_Error = 0
    Local $i_Error_desciption = ""
    If $s_CcAddress <> "" Then $objEmail.Cc = $s_CcAddress
    If $s_BccAddress <> "" Then $objEmail.Bcc = $s_BccAddress
    $objEmail.Subject = $s_Subject
    If StringInStr($as_Body, "<") And StringInStr($as_Body, ">") Then
        $objEmail.HTMLBody = $as_Body
    Else
        $objEmail.Textbody = $as_Body & @CRLF
    EndIf
    If $s_AttachFiles <> "" Then
        Local $S_Files2Attach = StringSplit($s_AttachFiles, ";")
        For $x = 1 To $S_Files2Attach[0]
            $S_Files2Attach[$x] = _PathFull($S_Files2Attach[$x])
;~          ConsoleWrite('@@ Debug : $S_Files2Attach[$x] = ' & $S_Files2Attach[$x] & @LF & '>Error code: ' & @error & @LF) ;### Debug Console
            If FileExists($S_Files2Attach[$x]) Then
                ConsoleWrite('+> File attachment added: ' & $S_Files2Attach[$x] & @LF)
                $objEmail.AddAttachment($S_Files2Attach[$x])
            Else
                ConsoleWrite('!> File not found to attach: ' & $S_Files2Attach[$x] & @LF)
                SetError(1)
                Return 0
            EndIf
        Next
    EndIf
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = $s_SmtpServer
    If Number($IPPort) = 0 then $IPPort = 25
    $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = $IPPort
    ;Authenticated SMTP
    If $s_Username <> "" Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusername") = $s_Username
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = $s_Password
    EndIf
    If $ssl Then
        $objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    EndIf
    ;Update settings
    $objEmail.Configuration.Fields.Update
    ; Set Email Importance
    Switch $s_Importance
        Case "High"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "High"
        Case "Normal"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Normal"
        Case "Low"
            $objEmail.Fields.Item ("urn:schemas:mailheader:Importance") = "Low"
    EndSwitch
    $objEmail.Fields.Update
    ; Sent the Message
    $objEmail.Send
    If @error Then
        SetError(2)
        Return $oMyRet[1]
    EndIf
    $objEmail=""
 EndFunc   ;==>_INetSmtpMailCom
 ;
;
; Com Error Handler
Func MyErrFunc()
    $HexNumber = Hex($oMyError.number, 8)
    $oMyRet[0] = $HexNumber
    $oMyRet[1] = StringStripWS($oMyError.description, 3)
    ConsoleWrite("### COM Error !  Number: " & $HexNumber & "   ScriptLine: " & $oMyError.scriptline & "   Description:" & $oMyRet[1] & @LF)
    SetError(1); something to check for when this function returns
    Return
EndFunc   ;==>MyErrFunc
 
Автор
D

Dk

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


Я извиняюсь, но я не понимаю в чём дело. Я опять же таки установил ToolTip для наглядности. Включил. В файле 11500 строк и он не обновляется, скрипт идёт и идёт не останавливаясь.
Я намеренно написал несуществующие файлы- тоже самое. Получается скрипт не видит мои файл 1.тхт, файл 2.тхт . Скрипт и файлы находятся в одной папке. Где может быть ошибка у меня?
 
A

Alofa

Гость
Dk , я смотрю вы постоянно используете функцию "ToolTip()" для тестов. Думаю будет лучше применять функцию "ConsoleWrite()" - добавил ее в свой предыдущий скрипт.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Dk
Получается скрипт не видит мои файл 1.тхт, файл 2.тхт
Пока файл не изменен, скрипт файлы игнорирует. Как только файл изменился(дописались строки), начинает обработку.
Я писал выше
Если файлы не изменены, то ничего не происходит. Менял значения вручную в файле 1.txt , после сохранения сразу выдавал результат.
После сохранения файл изменяется.
 
Автор
D

Dk

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

ildar сказал(а):
Dk
Получается скрипт не видит мои файл 1.тхт, файл 2.тхт
Пока файл не изменен, скрипт файлы игнорирует. Как только файл изменился(дописались строки), начинает обработку.
Я писал выше
Если файлы не изменены, то ничего не происходит. Менял значения вручную в файле 1.txt , после сохранения сразу выдавал результат.
После сохранения файл изменяется.

Я пpобывал и с изменяющимся файлом (к которому дописываются строки) и с обычным. Не работает.
Я же говорю я даже намеренно пишу другие файлы- которых нет, а он всё равно ведёт перебор строк.
Беру файлы, которые есть и меняю их сам, а скрипт просто перебирает строки дальше.
У меня даже простой вопрос, как он может перебирать строки несуществующих файлов?
Я ни на чём не настаиваю. Но по мне скрипт просто не видит файлы. ToolTip просто набирает и набирает. У Alofa видно, если программа записала 200 строк, то и скрипт прочитал 200 и ждёт новых. А в вашем скрипте программа не успела набрать 100 сток, a скрипт уже "ушёл" на 1200 .

Вообщем я сейчас подольше протестирую, чтоб не баламутить
Вот, что выдало в дальнейшем.

(59) : ==> Subscript used on non-accessible variable.
$aTXT2 = StringSplit($aFile2[$i], @TAB, 2)
$aTXT2 = StringSplit($aFile2^ ERROR

Ps

Я Включил встроенные MsgBox, и они срабатываю ... значит файлы видит..




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

Alofa сказал(а):
Dk , я смотрю вы постоянно используете функцию "ToolTip()" для тестов. Думаю будет лучше применять функцию "ConsoleWrite()" - добавил ее в свой предыдущий скрипт.
Скрипт откорректирован? Там нет смещений больше?
 

ildar

Осваивающий
Сообщения
252
Репутация
29
а он всё равно ведёт перебор строк
как это видно? Не может войти в перебор, если условие не состоялось:
Код:
If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1)
идет далее проверяя следующее и так по кругу, но строки не затрагивает
Беру файлы, которые есть и меняю их сам
Что меняю?


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

ildar сказал(а):
а он всё равно ведёт перебор строк
как это видно? Не может войти в перебор, если условие не состоялось:
Код:
If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1)
идет далее проверяя следующее и так по кругу, но строки не затрагивает
Беру файлы, которые есть и меняю их сам
Что меняю?

(59) : ==> Subscript used on non-accessible variable.
$aTXT2 = StringSplit($aFile2[$i], @TAB, 2)
$aTXT2 = StringSplit($aFile2^ ERROR
то что 1.txt может быть больше 2.txt я не учитывал.
 
Автор
D

Dk

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

Ildar

Всё я понял в чём причина.
У вас скрипт выдаёт все совпадения только после того как обновиться файл 2.тхт. А Главным условием было, что бы скрипт выдавал СРАЗУ совпадения, не дожидаясь обновления файла 2.тхт
 

ildar

Осваивающий
Сообщения
252
Репутация
29
ToolTip будет увеличиваться с частотой опроса 100 мс, потому что он внутри цикла. Я проверял с файлами которые ты выкладывал.
У вас скрипт выдаёт все совпадения только после того как обновиться файл 2.тхт
тоже не понятно, я его не трогал. Обновлял только 1.txt и он тут же на экран и на почту выдавал.
Может выложишь еще другие (проблемные файлы), хотя Alofa подобное уже просил.
Я повторюсь, на ранее выложенных файлах все работает как часики.

Если добавлять ToolTip то надо после этой строки
Код:
For $i = 1 + $iStr To UBound($aFile1) - 1
 
Автор
D

Dk

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

ildar сказал(а):
ToolTip будет увеличиваться с частотой опроса 100 мс, потому что он внутри цикла. Я проверял с файлами которые ты выкладывал.
У вас скрипт выдаёт все совпадения только после того как обновиться файл 2.тхт
тоже не понятно, я его не трогал. Обновлял только 1.txt и он тут же на экран и на почту выдавал.
Может выложишь еще другие (проблемные файлы), хотя Alofa подобное уже просил.
Я повторюсь, на ранее выложенных файлах все работает как часики.

Работаю с одним и тем же файлом (я его выложил Пост 51).
Скрипт ваш сработает, но только после того как файл 2.тхт был перезаписан программой. Это уже 100% У Alofa сразу срабатывало (Я к тому, что дело не в файле, который у всех одинаковый или в моей программе).

И у вас смещений в строках нет, как у Алофа, и выдаёт правильно всё, следовательно никаких других проблемных файлов нет.
Просто у Алофа смещение, а у вас срабатывает только после обновления файла 2.тхт. Ни файл, ни программа здесь не причём.
Может быть ваш скрипт срабатывает каким то образом не на обновление файла 2.тхт, а например когда он заново приходит в файле 1.тхт к первой строчке и после этого выдаёт весь результат.
 

ildar

Осваивающий
Сообщения
252
Репутация
29
Dk
Не буду цитировать выше написанное.
Я понял где засада. Alofa как то писал что в файлах встречается TAB где его не должно быть, поэтому деление по ТАВ тут не подойдет, нужно регулярное выражение.
Исправлю позже. (по ошибке тоже)

К сожалению не даются мне регулярные выражения. Да и голова вечером отказывается работать. Может Alofa подскажет как заменить
Код:
$aTXT1 = StringSplit($aFile1[12], @TAB, 2)
регулярным выражением.
 
A

Alofa

Гость
ildar тут еще выяснился "сюрприз" :shok:
Конструкция каждой строки такова:
[box]ASIN --> Name --> Lowest New Price --> Lowest Used Price --> Current Amazon Offer --> Availability --> Model --> Color --> Brand --> SalesRank --> и т.д...

*(где "-->" это TAB)[/box]
Так вот, мало того что в "Name" могут быть TAB-ы, но еще и в "Availability" тоже могут попасться. Кроме того, вместо "Availability" вообще может быть N/A. Посмотрите ASIN = 3932114523 в примерах.



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

ildar сказал(а):
Может Alofa подскажет ...
В вашем случае как-то так:
Код:
#include <Array.au3>
Local $aFile1[2]= ['"3932114523"	"Permission Marketing"	23,9	15,4	0	N/A	N/A	N/A	N/A	404771	0	0	"9783932114526"	N/A', _
				'"3932114523"	"Permission 	Marketing"	23,9	15,4	0	"XXXXXXX"	N/A	N/A	N/A	404771	0	0	"9783932114526"	N/A	']

For $sString In $aFile1
	$aTXT1 = StringRegExp($sString, '"(\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)
	_ArrayDisplay($aTXT1)
Next



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

Dk Тестируйте:
Код:
#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'
Global $hGUI, $ListView, $hButt1, $hButt2, $hGUIState, $hExit

$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('Очистить список', 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')

#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
			GUICtrlCreateListViewItem('|' & $asText1[0] & '|' & $asText1[1] & '|' & $asText2[$iCount + 2] & '|' & _
					$asText1[2] & '|' & $asText2[$iCount + 1] & '|' & @MDAY & '/' & @MON & '/' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC, $ListView)
			GUISetState(@SW_SHOWNORMAL)
			;SoundPlay(@WindowsDir & '\media\Windows Ringin.wav') ; Отключил пока, для чистоты эксперимента
		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 20
		$hFile1 = FileOpen($sFile1)
		If $hFile1 Then ExitLoop
		Sleep(90)
	Next
	If $hFile1 = -1 Then Exit MsgBox(16, 'Ошибка!', 'Неудалось открыть файл "1.txt".')
	For $i = 0 To 20
		$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 _ListViewClear()
	GUICtrlSendMsg($ListView, $LVM_DELETEALLITEMS, 0, 0)
EndFunc   ;==>_ListViewClear

Func _Exit()
	If $hFile1 Then FileClose($hFile1)
	Exit
EndFunc   ;==>_Exit
 

ildar

Осваивающий
Сообщения
252
Репутация
29
В вашем случае как-то так:
Alofa спасибо.
Код:
#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)
;_ArrayDisplay($aFile2)
;получаем время изменения файла
$t1 =  FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

While 1
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  ;MsgBox(0, 'Первое условие', 'Сработало 1')
	  $iStr = 0
	  $aFile2 = FileReadToArray($sFile2)
	  $t2 =  FileGetTime($sFile2, 0, 1)
	  Else
   EndIf
   If $t1 <> FileGetTime($sFile1, 0, 1) And $t2 = FileGetTime($sFile2, 0, 1) Then
		 ;MsgBox(0, 'Второе условие', 'Сработало 2')
		 $aFile1 = FileReadToArray($sFile1)
		 $t1 =  FileGetTime($sFile1, 0, 1)
		 $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
Изменено на регулярное выражение. Учитывается то что файл 1.txt может быть больше файла 2.txt
 
A

Alofa

Гость
ildar сказал(а):
Учитывается то что файл 1.txt может быть больше файла 2.txt
Такого не может быть. Перечитайте шапку темы + Это.

OffTopic:

Мне кажется данное обсуждение давно уже вышло за рамки названия темы.
Надо наверно название поменять, с учетом раздела где находимся.
 
Верх