Что нового

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

Dk

Новичок
Сообщения
358
Репутация
2
Версия AutoIt: 3.10

Описание:
Здравствуйте.

Есть два текстовых файла (с разделением "Табуляция" 8 знакомест ). Если открыть их в Excel с разделением табуляция, то будет 25 столбиков в каждом файле
1)1.txt (постоянно занят другой программой, поэтому доступен только для чтения)
2)2.txt (Файл доступен для чтения и редакции)

Файл 1.txt постоянно обновляется, происходит это следующим образом
Примерно каждую секунду записывается 20 строк, так доходит до 30 тыс. строк и происходит запись/перезапись файла 2.txt, а сам файл 1.txt обнуляется и с нуля опять идёт запись по 20 строк.

Мне нужно что бы скрипт сравнивал значение строк из файла 1.txt в 4-ом столбце, со значением в 2.txt, тоже в 4-ом столбце (не на оборот).

Условия для сравнений.
Значение строки в файле 1.txt , в 4-ом столбце в 2 раза меньше чем значение в 2.txt и при этом значение строки в столбце 10 в файле 1.txt должно быть меньше 300000.
При выполнении этого условия должен появляться обычный MsgBox со значением строки 1-го столбца файла 1.txt
Программа должна делать это постоянно, пока я сам не прерву её.

Примечания:
Примечание.
Поскольку файл 1.txt постоянно обновляется, то нужно что бы при каждом завершении считывания файл открывался снова.
На пример в файле уже записано 100 строк, я открыл (Notpade) его и читаю, в это время было дописано ещё 100 строк, они мне будут видны только после закрытия и открытия. Я думаю тоже самоe будет если открыть файл (Fileopen). Файл откроется и будет видно только то, что было записано именно на момент открытия. Файл 2.txt тоже должен открываться каждый раз заново.
Инoгогда в 4-ом столбце (во всех файлах ) может стоять N/A , если стоит N/A , то скрипт при сравнении должен пропускать эту строку (не сравнивать)
MsgBox должен показать мне всего один раз цену товара. В следующий раз это должно произойти только при обновлении файла 2.тхт.
СОВПАДЕНИЯ УСЛОВИЙ ДОЛЖНЫ ПОКАЗЫВАТЬСЯ СРАЗУ, а не после обновления файла 2.тхт.



Внимание иногда программа может пропускать строку. Следовательно расположение строк может быть разным.


Файлы прикреплены.
 

Вложения

  • 1.txt
    2.4 КБ · Просмотры: 16
  • 2.txt
    2.4 КБ · Просмотры: 12

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Значение строки в файле 1.txt , в 4-ом столбце в 2 раза меньше чем значение в 2.txt
поиск по каждой строке вести до первого совпадения или таких совпадений может быть несколько и нужно показать все ?
 
A

Alofa

Гость
OffTopic:
ra4o человек на amazon.de играет.
Ему нужно знать когда в 2 раза снизится цена на конкретный товар из списка.

P.s: Dk это я не в упрек, просто ra4o так будет проще понять.
 
Автор
D

Dk

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

поиск по каждой строке вести до первого совпадения или таких совпадений может быть несколько и нужно показать все ?

Ra4o
Совпадение будет всегда только одно. Впринцыпе и строки расположены всегда одинаково (что в файле 1.тхт, что в файле 2.тхт) Мне нужно видеть изменения, в столбце 4.
 
A

Alofa

Гость
Насколько я понял то некая программа мониторит цену на сайте и скидывает информацию в "1.txt", которая потом перетекает в "2.txt".
Соответственно, что мы имеем:
- Файл "2.txt" всегда на 300000 строк, который нужно не просто прочитать и выделить цену, а нужно найти последнее ее обновление на тот или иной товар в данном файле, отбросив старые значения и держать это в памяти до тех пор, пока "2.txt" не будет перезаписан. Реакцией на это будет повторение данного шага.
- В файле "1.txt" нужно мониторить только самые свежие цены и сравнивать их с данными в памяти.

У меня вот только 2 вопроса:[list type=decimal][*]Эта некая программа дописывает новые данные в конец или в начало файла "1.txt"?
[*]
Dk сказал(а):
...При выполнении этого условия должен появляться обычный MsgBox
"MsgBox()" является блокирующей функцией, т.е. пока данное окно висит скрипт не работает, вы в курсе?[/list]

Если в чем-то ошибся - исправьте меня Обязательно.
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
247
Не нужно вести поиск по всему документу 2.txt, а сравнивать только значение 1-й строки с 1-й, 2-й со 2-й итд ?
 
Автор
D

Dk

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

Alofa сказал(а):
Насколько я понял то некая программа мониторит цену на сайте и скидывает информацию в "1.txt", которая потом перетекает в "2.txt".
Соответственно, что мы имеем:
- Файл "2.txt" всегда на 300000 строк, который нужно не просто прочитать и выделить цену, а нужно найти последнее ее обновление на тот или иной товар в данном файле, отбросив старые значения и держать это в памяти до тех пор, пока "2.txt" не будет перезаписан. Реакцией на это будет повторение данного шага.
- В файле "2.txt" нужно мониторить только самые свежие цены и сравнивать их с данными в памяти.

У меня вот только 2 вопроса:[list type=decimal][*]Эта некая программа дописывает новые данные в конец или в начало файла "1.txt"?
[*]
Dk сказал(а):
...При выполнении этого условия должен появляться обычный MsgBox
"MsgBox()" является блокирующей функцией, т.е. пока данное окно висит скрипт не работает, вы в курсе?[/list]




Если в чем-то ошибся - исправьте меня Обязательно.
Alofa
Да, Вы всё верно поняли.

1) Строки дописываются в конец файл по 20 строк (в файле 1.тхт). Файл 2.тхт - это уже первый опрос цен (old data). Новые-свежие данные поступают в файл 1.тхт. Файл 1 доходит до 30 тыс. и эти данны перехпдят в файл 2.

2) Скрипт должен работать дальше. И MsgBox должен показать мне всего один раз цену товара. В следующий раз это должно произойти только при обновлении файла 2.тхт. Не дописал текст. Есть возможность заменить MsgBox на другую функцию, что бы скрипт не блокировался?
Был не в курсе, спасибо.
В идеале хотелось бы что бы сразу на почту отправлялось. Но я не хочу усложнять пока задачу


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

ra4o сказал(а):
Не нужно вести поиск по всему документу 2.txt, а сравнивать только значение 1-й строки с 1-й, 2-й со 2-й итд ?

Да, я земетил, что они находятся всегда в одно и том же месте. Поэтому, я думаю поиск по всему файлу будет излишнем и замедлит работу.


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

Хотел спросить, кто нибудь взялся за это дело? :-[ :-[
Или мне начинать отчаиваться? :'(
 
A

Alofa

Гость
Dk вы можете предоставить Полный пример какого-либо "2.txt"?
 
Автор
D

Dk

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

Alofa сказал(а):
Dk вы можете предоставить Полный пример какого-либо "2.txt"?

Полный сюда не поместится (нельзя прикрепить).
А зачем полный? Я могу дать, побольше, где 200 записей например. Но смысл же останется тот же?
Ведь файл 2.тхт может быть и 100 тыс или просто 3 тыс.

Всё зависит от того как я укажу. На данный момент он стабильно 12500.
 
A

Alofa

Гость
Re:

Dk сказал(а):
... Строки дописываются в конец файл по 20 строк (в файле 1.тхт).
Каждый раз по 20 строк - это всегда = 20 одних и тех же ISBN-10 товаров?

Dk сказал(а):
... Я могу дать, побольше, где 200 записей например.
Давайте.
 
Автор
D

Dk

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

Alofa сказал(а):
Dk сказал(а):
... Строки дописываются в конец файл по 20 строк (в файле 1.тхт).
Каждый раз по 20 строк - это всегда = 20 одних и тех же ISBN-10 товаров?

Dk сказал(а):
... Я могу дать, побольше, где 200 записей например.
Давайте.

Нет, новые.
Полная цепочка такая есть файл ISBN-Дата.тхт 30 тыс строк. (там только ISBN) Программа делает запрос этих ISBN и создаёт файл 1.тхт .когда проходит первый круг - доходит до конца, создaётся файл 2.тхт (он уже имеет полную базу - все 30 тыс. строк как и файл ISBN-Дата.тхт). Впринипе то что идёт запись именно по 20 строк не так важно. И на фтором круге файл 1.тхт обновляется (обнуляется и построчно идёт запись заново) потом доходит до конца и перезаписывает файл 2.тхт (актуальными данными- ценами).

Я прикрепил 1.тхт и 2.тхт (обязательно используйте именно эти два)

Там скорее всего нет нет условий для выдачи оповещения, но их можно подкорректировать разумеется, что бы проверить скрипт
 

Вложения

  • 1.txt
    6.3 КБ · Просмотры: 11
  • 2.txt
    48.9 КБ · Просмотры: 13
A

Alofa

Гость
И еще вопрос:
А эта некая программа случаем не Autoit написана?
Просто рациональней будет чтобы все это делала она.
 
Автор
D

Dk

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

Alofa сказал(а):
И еще вопрос:
А эта некая программа случаем не Autoit написана?
Просто рациональней будет чтобы все это делала она.

К сожалению нет, это готовая программа.
 
A

Alofa

Гость
Re:

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



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

Dk сказал(а):
... при этом значение строки в столбце 10 в файле 1.txt должно быть меньше 300000
Значения в "SalesRank" (10 столбец) могут быть "0" или "N/A"?
 
Автор
D

Dk

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



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

Значения в "SalesRank" (10 столбец) могут быть "0" или "N/A"?




Я ИЗВИНЯЮСЬ может быть ноль и N/A
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Сравнивать 2.тхт и 2.тхт(после его обновления) - это вариант?
Их строки будут совпадать, кроме 4-го столбца?
 
Автор
D

Dk

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

ildar сказал(а):
Сравнивать 2.тхт и 2.тхт(после его обновления) - это вариант?
Их строки будут совпадать, кроме 4-го столбца?


Нет, всегда сравнивать 1.тхт с 2.тхт. Так как в файл 1.тхт постоянно обновляется построчно, а файл 2.тхт обновляется только, когда файл 1 дойдёт до 30тыс. строк. А это занимает около 30 минут. Если сделать так то сравнение будет неоперативно. А в моём случае программа сразу начнёт сравнивать уже те строки, что имеются в файле 1.тхт не доходят до 30 тыс. и обновления файла 2.тхт

Полная цепочка такая есть файл ISBN-Дата.тхт 30 тыс строк. (там только ISBN) Программа делает запрос этих ISBN и создаёт файл 1.тхт .когда проходит первый круг - доходит до конца, создaётся файл 2.тхт (он уже имеет полную базу - все 30 тыс. строк как и файл ISBN-Дата.тхт). Впринипе то что идёт запись именно по 20 строк не так важно. И на фтором круге файл 1.тхт обновляется (обнуляется и построчно идёт запись заново) потом доходит до конца и перезаписывает файл 2.тхт (актуальными данными- ценами).
 
Автор
D

Dk

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

ildar сказал(а):
Кусок кода(сравнение данных, 4-й столбец)
Код:
#include <Array.au3>

$iStr = 2 ;начмнаем со 2-строки, в 1-й нечего сравнивать

While 1
   $iStrTXT1 = FileReadLine(@ScriptDir & '\1.txt', $iStr)
   If @error = -1 Then ExitLoop
   $aTXT1 = StringSplit($iStrTXT1, @TAB, 2)
   $iStrTXT2 = FileReadLine(@ScriptDir & '\2.txt', $iStr)
   If @error = -1 Then ExitLoop
   $aTXT2 = StringSplit($iStrTXT2, @TAB, 2)
   If $aTXT1[3] <> $aTXT2[3] Then MsgBox(0, 'Несовпадают данные этой строки', $iStrTXT1)
   $iStr += 1
WEnd
   MsgBox(0, '', 'End')

Спасибо за начало.

Но мне очень важны соблюдения всех условий.
Смотрите Примечание и Условия в первом посте.
Пс Да я понимаю, что это всего лишь кусочек - он самый лёгкий :-[


Условия для сравнений.
Значение строки в файле 1.txt , в 4-ом столбце в 2 раза меньше чем значение в 2.txt и при этом значение строки в столбце 10 в файле 1.txt должно быть меньше 300000.
При выполнении этого условия должен появляться обычный MsgBox со значением строки 1-го столбца файла 1.txt
Программа должна делать это постоянно, пока я сам не прерву её.

Примечания:
Примечание.
Поскольку файл 1.txt постоянно обновляется, то нужно что бы при каждом завершении считывания файл открывался снова.
На пример в файле уже записано 100 строк, я открыл (Notpade) его и читаю, в это время было дописано ещё 100 строк, они мне будут видны только после закрытия и открытия. Я думаю тоже самоe будет если открыть файл (Fileopen). Файл откроется и будет видно только то, что было записано именно на момент открытия. Файл 2.txt тоже должен открываться каждый раз заново.
Инoгогда в 4-ом столбце (во всех файлах ) может стоять N/A , если стоит N/A , то скрипт при сравнении должен пропускать эту строку (не сравнивать)
MsgBox должен показать мне всего один раз цену товара. В следующий раз это должно произойти только при обновлении файла 2.тхт. :
 

ildar

Осваивающий
Сообщения
252
Репутация
30
Поправил учловие
Код:
#include <Array.au3>

$iStr = 2 ;начмнаем со 2-строки, в 1-й нечего сравнивать

While 1
   $iStrTXT1 = FileReadLine(@ScriptDir & '\1.txt', $iStr)
   If @error = -1 Then ExitLoop
   $aTXT1 = StringSplit($iStrTXT1, @TAB, 2)
   $iStrTXT2 = FileReadLine(@ScriptDir & '\2.txt', $iStr)
   If @error = -1 Then ExitLoop
   $aTXT2 = StringSplit($iStrTXT2, @TAB, 2)
   If $aTXT1[3] < $aTXT2[3]/2 And $aTXT1[9] < 300000 Then MsgBox(0, 'Не совпадают данные этой строки', $aTXT1[0])
   $iStr += 1
WEnd
   MsgBox(0, '', 'End')
В целом какой должен быть алгоритм понятен. Остальное тоже реально сделать, но нет времени.
 
Автор
D

Dk

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

ildar сказал(а):
Поправил учловие
Код:
#include <Array.au3>

$iStr = 2 ;начмнаем со 2-строки, в 1-й нечего сравнивать

While 1
   $iStrTXT1 = FileReadLine(@ScriptDir & '\1.txt', $iStr)
   If @error = -1 Then ExitLoop
   $aTXT1 = StringSplit($iStrTXT1, @TAB, 2)
   $iStrTXT2 = FileReadLine(@ScriptDir & '\2.txt', $iStr)
   If @error = -1 Then ExitLoop
   $aTXT2 = StringSplit($iStrTXT2, @TAB, 2)
   If $aTXT1[3] < $aTXT2[3]/2 And $aTXT1[9] < 300000 Then MsgBox(0, 'Не совпадают данные этой строки', $aTXT1[0])
   $iStr += 1
WEnd
   MsgBox(0, '', 'End')
В целом какой должен быть алгоритм понятен. Остальное тоже реально сделать, но нет времени.


Мне бы на первом этапе реализовать вот это условие :-[ :-[
MsgBox должен показать мне всего один раз цену товара. В следующий раз это должно произойти только при обновлении файла 2.тхт.
Пс
Разумеется как будет время :-[
 
Верх