Что нового

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

ildar

Осваивающий
Сообщения
252
Репутация
30
Такого не может быть
Но все же было при тесте. Количество товаров остается неизменным? Он не может пополнятся?
OffTopic:
Наш баламут потерялся?
 
Автор
D

Dk

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

Я здесь, я тестирую, я никуда не делся. Просто, что бы выявить все недостатки разом (если они есть) я буду как раньше уделять много времени, а потом в одном посте писать по пунктам

Количества товаров всегда одинаково.
 
A

Alofa

Гость
ildar сказал(а):
... Количество товаров остается неизменным? Он не может пополнятся?
Да.
С одной стороны есть некий файл "ISBN-Дата.тхт", где автор саморучно или каким иным способом вписывает нужные "ASIN" товаров которые хочет мониторить. И есть некая программа, с другой стороны, которая читает эти данные и занимается мониторингом нужных товаров.
По мере скачивания информации она (программа) постоянно дописывает новые данные в "1.txt". Когда данные на ВЕСЬ список товаров полученны, программа анализирует новые цены с ценами из "2.txt" --> скидывает инфу на Email автора --> перезаписывает "2.txt" полученными данными из "1.txt" --> очищает "1.txt" --> и начинает процесс заново.
 
Автор
D

Dk

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

Alofa
К сожалению тоже самое, такое же смещение (параметры от разных продуктов)

Ildar
Ваш скритп вообще никак не реагирует - ничего не происходит.


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

У меня следующее предложение.
Если я правильно понял, вы не можете разделить столбцы? Моё предложение такое. Excel, разделяет их без проблем. Что если открывать excelem и сохранять файл как csv. с разделителем точка запятая? Я так сделал, файл ИДЕАЛЬНЫЙ и его действительно легко читать в массив.

Смысл такой файл 1.тхт будет каждую секунду открываться и сохраняться в файл 1.csv и потом уже этот файл будет считываться.
Но если это может делать Excel, значить ведь реально сделать и без него?
 
A

Alofa

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

Dk сказал(а):
К сожалению тоже самое...
Не верю.
В скрипт добавлена "ConsoleWrite()", которая пишет статистику в консоль. Предоставьте часть этого списка, где происходит смещение - тогда поверю.
 
Автор
D

Dk

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

Alofa сказал(а):
Dk сказал(а):
К сожалению тоже самое...
Не верю.
В скрипт добавлена "ConsoleWrite()", которая пишет статистику в консоль. Предоставьте место где происходит смещение.

Ok.Через 15 минут предоставлю. В конзоле всё красиво. Но когда выскакивает окошко с совпадениями, то там ISBN номер, цена и название товара, от разных продуктов.


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


У Ildara скрипт срабатывает чётко! Но как я уже сказал у него результат показываются только после окончания всего цикла либо обновления 2.тхт либо, когда скрипт начинает читать первую строку в файле 1.тхт. И только после ЭТОГО появляется табличка с совпадениями. НО СМЕЩЕНИЙ НЕТ.

У вас получается у каждого свой кусочек.
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Alofa опередил :smile:
Код:
#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)
			ConsoleWrite($aTXT1[2] & ' -- ' & $aTXT2[2] & @CRLF)
			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.тхт
а вот это уже интересно. Тогда не надо тестить.

Код:
#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 = 0			;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)
			ConsoleWrite($aTXT1[2] & ' -- ' & $aTXT2[2] & @CRLF)
			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
Вот это попробуй.
 
Автор
D

Dk

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

Alofa сказал(а):
Dk сказал(а):
К сожалению тоже самое...
Не верю.
В скрипт добавлена "ConsoleWrite()", которая пишет статистику в консоль. Предоставьте часть этого списка, где происходит смещение - тогда поверю.

Вот скрин, там ИСБН не совпадают названием и с ценой.
http://s019.radikal.ru/i602/1603/b3/b19ab0c6aa5c.jpg

Я могу Вам и с конзольки дать, но там ничего не видно. Там идёт и идйт своим чередом, и всё красиво
 

ildar

Осваивающий
Сообщения
252
Репутация
30
DkМое сообщение выше. Исправленное.


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

Alofa В этом куске
Код:
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)
в первой и второй строке
Код:
$asText2[$iCount + 2]
в последней
Код:
$asText2[$iCount + 1]
так должно быть?
 
Автор
D

Dk

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

ildar сказал(а):
DkМое сообщение выше. Исправленное.


Работает отлично, выдаёт сразу! Смещений нет!
Единственное я что бы проверит "до конца" поставил условие If $aTXT1[2] = $aTXT2[2] And $aTXT1[3] < 3000000 Then
что бы показало мне все 11500 строк совпадении. Но что в конзольке что в таблице показывает только 5020. У меня просто вопрос, это ограничение самой функции или может всё же скрипт перестаёт работает после 5020 строки. Просто конзолька замирает именно на 5020. Мне нужно время, что бы посмотреть, как она будет вести себя на последующем круге.


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



К сожалению мне нужно идти (
Я вечером обязательно всё досконально протестирую!
Никуда не уходите :-[ :-[
 
A

Alofa

Гость
ildar сказал(а):
Код:
$asText2[$iCount + 1]
так должно быть?
Да. Это название товара.




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

OffTopic:
Dk я смотрю у вас проблемы с отображением кирилицы?
В SciTE тоже так?
 
Автор
D

Dk

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



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

OffTopic:
Dk я смотрю у вас проблемы с отображением кирилицы?
В SciTE тоже так?


Да, в редкторе тоже, но сразу хочу подчеркнуть это никак не влияет на работу скрипта- 100%.


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

Ildar

К сожалению не работает корректно.
Скажу сразу для наглядности я поменял условие на
Код:
If $aTXT1[2] = $aTXT1[2] And $aTXT1[3] < 3000000 Then
. Что бы про сторку, было одно совпадение.
Когда программа записала к примеру 4 тыс. строк, я включаю ваш скрипт и происходит следующее.
Скрипт доходит до 4 тыс. строк = 4 тыс. совпадений (сразу показывает совпадения, что уже хорошо), но дальше он не идёт. Потом когда программа доходит до 11500 строк, начинается обновление файла 2.тхт оно длится около 3-5 секунд и только потом обнуляется файл 1.тхт. Поскольку файл 2.тхт обновляется раньше, чем обнуляется файл 1.тхт, скрипт считывает быстро файл 1.тхт все 11500 строк быстро и дальше стоит ждёт.

Добавьте следующее, что бы скрипт не начинал сразу после обновления считывать файл 1. тхт с первой строчки, после обновления файла 2.тхт, нужно поставить задержку, что бы файл успел обновиться, а файл 1.тхт обнулиться. Таким образом будет решена одна проблема (но только одна). Потому что по скольку файл 1.тхт будет пуст либо туда будет успето записано программой пару строк, то скрипт после обновления опять прочитает эти пару сток и будет стоять ждать обновления.

Краткий итог.

1)Не работает функция прочтения именно НОВЫХ строк (дописанных), читает только то, что было написано до открытия файла. (У Alofa работает, подсмотрите у него, если он не против)
2) Поставьте задержку, что бы скрипт после обновления файла 2.тхт не успевал прочитать старые строки, так как они ещё не успели удалиться.

:'(
 
Автор
D

Dk

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

Alofa сказал(а):
Dk сказал(а):
Да, в редкторе тоже..
*Клик*.

Dk вы можете скинуть пример "1.txt" и "2.txt" (строк на 10) где происходит смещение?

Я включу программу и дождусь вывода совпадения, если там буде смещение. Я отключу программу и залью отдельно эти два файла сюда Вам. Но сток на 10 скорее всего не поличится, сколько запишет программа ... (к сожалению смогу сделать это только вечером.)
За видео спасибо, но не помогает это, я уже побывал.
 

ildar

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


$hLog = _Log_Open(@ScriptDir & '\MyProg.log', '#########')
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 = 0			;FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

_Log_Report($hLog, 'Program start', 0)
While 1
   _Log_Report($hLog, '$t1 = ' & $t1 & ' | ' & FileGetTime($sFile2, 0, 1), 3)
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  _Log_Report($hLog, '2.txt обновился', 2)
	  $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
		 _Log_Report($hLog, '1.txt обновился', 1)
		 $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)
			ConsoleWrite($aTXT1[2] & ' -- ' & $aTXT2[2] & @CRLF)
			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(500)
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
для сбора логов. Долго гонять не обязательно. Нужно добавить в папку include то что во вложении Log.au3. В папке скрипта появится файл MyProg.log. Выложи его потом сюда.

Торопился вместо & вставил $.
Исправил
 

Вложения

  • Log.au3
    11 КБ · Просмотры: 2
Автор
D

Dk

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

Alofa сказал(а):
Dk сказал(а):
Да, в редкторе тоже..
*Клик*.

Dk вы можете скинуть пример "1.txt" и "2.txt" (строк на 10) где происходит смещение?


Вот ровно с этими файлами я работал. Скрин показывает совпадения со смещением.
http://files.d-lan.dp.ua/download?file=1cb84ef41ff8c2c94c121b72b93e84b1 1.txt
http://files.d-lan.dp.ua/download?file=e7aeca3d027bf49f0fb6d95641ad74d4 2.txt
http://files.d-lan.dp.ua/download?file=95dac714ee5ca6f3f9dc33cc4fcfc3fb Foto
Совпадения начал выдовать уже где то под конец файла.



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

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


$hLog = _Log_Open(@ScriptDir & '\MyProg.log', '#########')
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 = 0			;FileGetTime($sFile1, 0, 1)
$t2 =  FileGetTime($sFile2, 0, 1)

$iStr = 0

_Log_Report($hLog, 'Program start', 0)
While 1
   _Log_Report($hLog, '$t1 = ' & $t1 $ ' | ' & FileGetTime($sFile2, 0, 1), 3)
   If $t2 <> FileGetTime($sFile2, 0, 1) Then		; если 2.txt обновился начинаем сначала
	  _Log_Report($hLog, '2.txt обновился', 2)
	  $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
		 _Log_Report($hLog, '1.txt обновился', 1)
		 $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)
			ConsoleWrite($aTXT1[2] & ' -- ' & $aTXT2[2] & @CRLF)
			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(500)
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
для сбора логов. Долго гонять не обязательно. Нужно добавить в папку include то что во вложении Log.au3. В папке скрипта появится файл MyProg.log. Выложи его потом сюда.

(50,43) : error: syntax error (illegal character)
_Log_Report($hLog, '$t1 = ' & $t1 $
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Маловато полминуты.
Код:
#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 пройдет)
 
A

Alofa

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

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


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

Все норм.
 
Верх