[identity profile] karakhan.livejournal.com posting in [community profile] useful_faq
Друзья, нужна помощь с Экселем!

Имеется файл .xls с кучей листов, под завязку набитых однотипными записями (логи). Записей порядка 700000.
Записи имеют вид "Имя_человека" - "Дата_время" (ну и плюс всякие второстепенные данные). По одному человеку может быть куча записей в один день, но в разное время.
Необходимо обработать это все так, чтоб для каждого человека оставалась только одна запись за день, но с минимальным и максимальным временем за этот же день (в результате останется не так уж много строк, в один лист экселя все поместится).

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

Посоветуйте механизм/алгоритм/процедуру, которые помогут решить поставленную задачи во вменяемые сроки (ну хотя бы чтоб за ночь обсчиталось). Не обязательно листинг приводить, подайте идею, докручу сам.
Да, использовать можно только встроенные функции Excel.  Access, SQL, Delphi и прочие блага цивилизации, увы, недоступны.


Всем заранее спасибо.

Date: 2010-10-04 07:30 pm (UTC)
From: [identity profile] uttha.livejournal.com
Какой точно вид имеет запись, можно ли ее распарсить? Может вывесите куда-нибудь кусок лога?

Date: 2010-10-04 08:22 pm (UTC)
From: [identity profile] ikaktys.livejournal.com
VBA в excel'e позволяет делать практически все, работать с таблицей как угодно, читать, писать, форматировать и прочее, надо просто найти программера на VB/VBA.

но да, Excel тормозной, главная фишка - писать не по одной клетке, а заполнять массив (1-2 мерный) и присваивать его к Range объекту, например сразу целую строчку или несколько, на пару сотен клеток время тратится только чуть больше чем на одну клетку.

Date: 2010-10-05 05:44 am (UTC)
From: [identity profile] ikaktys.livejournal.com
попробуй сдлать все за один проход и результаты пиши в собственный массив, а уже в конце скидывай его в таблицу, а то твой FIND каждый раз проходит по всей таблице, индексов то нет, не база данных.

Date: 2010-10-04 09:08 pm (UTC)
From: [identity profile] primavara.livejournal.com
Excel не очень подходит для обработки такого массива записей, поскольку объекты очень тяжелы. Если есть только вариант VBA, то можно сделать выгрузку всех записей в plain text (csv или какие там еще форматы есть) и дальше использовать старые добрые массивы, причем лучше типизированные безо всяких Variant.

Date: 2010-10-04 09:18 pm (UTC)
From: [identity profile] primavara.livejournal.com
хотя если подумать можно обойтись и без программирования, это же тупая агрегация и сводной таблицы Excel д.б. достаточно, только что у вас много листов

Re

Date: 2010-10-05 03:57 am (UTC)
From: [identity profile] granite-golem.livejournal.com
700 тысяч? Правильно говорят, что Excel для этого не годится. Переползайте на Access, там пользуйтесь SQL. Результаты можно экспортировать в тот же Excel, но обработку вести быстрее именно в Access.

Re

Date: 2010-10-05 04:57 am (UTC)
From: [identity profile] granite-golem.livejournal.com
Поставьте MySQL Server, он бесплатный.

Re: Re

Date: 2010-10-05 05:30 am (UTC)
From: [identity profile] 3jia5l-ca6aka.livejournal.com
двачую

Date: 2010-10-05 07:45 am (UTC)
From: [identity profile] nasty-weather.livejournal.com
Пришлите мне это чудовище, я вам напишу либо скрипт, либо функцию. По описанию, дело яйца выеденного не стоит. Разве что работать будет медленно... Но это мы увидим.

Date: 2010-10-05 08:14 pm (UTC)
From: [identity profile] nasty-weather.livejournal.com
20 мало, надо хотя бы 200. Давайте усечённый, вместе с существующим скриптом.

Date: 2010-10-06 07:02 am (UTC)
From: [identity profile] nasty-weather.livejournal.com
Если бы могли прислать всё чудовище, можно было бы по-быстрому перегнать его в Аксесс и одним запросом минут за пять.... Там коммерческая тайна, что ли?
Но можно и в Excel. Так что - пришлёте? Самой интересно стало.

Date: 2010-10-05 08:10 am (UTC)
ext_661898: (Default)
From: [identity profile] lomelind.livejournal.com
сурово-то как...
Я бы сначала из "файл с кучей листов" сделала "куча файлов по одному листу" - пусть даже ручками. Мне при обработке "много-много данных" это помогало.
Дальше - есть в экселе такая радость, как сортировка таблицы по столбцу. Выделяем ВСЮ таблицу, и сортируем по столбцу человек
пишем скрипт который идёт по строчкам
если в этой строчке вася иванов а в следующей петя петров - васю переносим на второй лист
если же в следующей тоже вася то идём пока вася не кончится, обрабатываем собранного васю, и на следующий лист идёт одна запись, куда засунуто всё про васю
как-то так
затем после того как все листы так обработаны - собираем улов на один лист, и к этому листу применяем тот же метод (вдруг у нас вася не на одном листе наследил)