![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 13.09.2011
Сообщений: 29
|
![]()
Добрый день!
Возник такой вопрос: есть .txt файл следующего вида: index;yyyy;mm;dd;Tmin;Q;Tmid;Q;Tmax ;Q;R;CR;QR часть файла во вложении (там несколько лет и один индекс) Мне необходимо узнать средние суточные значения Tmid за последние xx лет по каждому индексу, т.е. "среднее Tmid первого января за последние 30 лет индексом таким-то составляла столько-то, второго января столько-то и т.д." и необходимо подсчитать, как часто встречалась каждое значение Tmid за последние хх лет по каждому индексу. никак не могу придумать, как это реализовать. знакомый посоветовал создать массив Tmid(yy,mm,dd), но, сделав его я так и не понял, как мне с ним дальше плясать. Пытался сделать перечислением переменных по очереди, но получается уж очень долго. Может кто-чего посоветует??? P.S.: С VBA работаю совсем недавно... стоит MS Office 2007 |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Массив создали?
Теперь прогоняете его через словарь - как отбор уникальных делаете по mm & "|" & dd, результаты складываете в другой параллельный массив. Туда помещаете количество повторов и сумму - потом (или сразу) можно подбить среднее.
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 13.09.2011
Сообщений: 29
|
![]()
а не подскажите, как это делается?
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Вот отбор уникальных (и суммирование сумм) из массива, который получен с листа:
Код:
В общем, на этой основе можно сделать - что-то добавить, что-то выкинуть. Вместо temp = Trim(a(i, 1)) даёте свою склейку дата+месяц.
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
#5 | |||
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Попробуйте.
Массив создал сам, одной строкой. В файле-результате столбцы Tsum и Tcount может быть и не нужны, но для информации не лишние. Путь к текстовику поставьте свой. Почти без изменений взял приведённый выше код. Код:
Вот только что-то на ADO вариантов не предлагают... P.S. Цитата:
Добавить всего одну проверку aa(1). P.P.S. А почему по вопросу с csv не отписались? Я волнуюсь... Ещё одна тема без результата - и всё... И кстати, тот код и этот - буквально братья, не находите? В принципе, если бы в том разобрались - этот вопрос могли бы и не задавать... И этот вообще, и Цитата:
И ещё - в описании явно ошибка, не вяжется Цитата:
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 22.09.2011 в 22:36. |
|||
![]() |
![]() |
![]() |
#6 | |||
Пользователь
Регистрация: 13.09.2011
Сообщений: 29
|
![]() Цитата:
Цитата:
Мне казалось, что я отписывался, щас исправлюсь. Цитата:
Да, Вы правы. пропустил: index;yyyy;mm;dd;Q;Tmin;Q;Tmid;Q;Tmax ;Q;R;CR;QR 27612;1949; 1;26;0; -6.8;0; -3.1;0; -0.7;0; 0.0;2;0 |
|||
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Ну и отлично.
В коде ничего сложного нет - 1. Читаем весь текст в массив, разбивая по строкам. Тут вероятно может быть сложность, если файл будет уж очень большой, на сотни мегабайт. Но я с такими так не работал, поэтому точно не знаю. Иногда приходится разбивать не по vbNewline, а по chr(13) - зависит от конкретного файла. В общем - тут главное любым способом получить массив строк. Или можно вместо массива читать построчно непосредственно файл, хотя это вероятно будет медленнее, но как вариант при работе с огромным файлом (который трудно сразу весь запихннуть в память) вполне возможен. 2. Перебираем этот массив, разбивая теперь уже каждую строку по ";". Кстати, забыл Dim aa сделать... Не критично, но может ругнуться, если Option Explicit стоит. Но я сперва на ходу заменяю точки на системный разделитель - у меня с точками не работает. Хотя Вам возможно заменять точку на точку и лишнее ![]() 3. Отбираем в словарь значение, собранное из индекса, даты и месяца. В параллельный массив для этого значения помещаем нужные данные. 4. При повторе изменяем по этому уникальному его значения в массиве. 5. Выгружаем результат. Выгружать можно как угодно - в новую книгу или в новый лист, или на этот же лист, или даже писать в другой текстовый файл - не принципиально. Есть ещё мелочи по откидыванию ненужных пустых строк (If Len(Trim(a(i))) Then) и строк без значимых значений (If Len(Trim(aa(7))) Then), но это уже несущественные, хотя и необходимые мелочи. Но это можно было бы сделать и иначе. P.S. Забыл про "и необходимо подсчитать, как часто встречалась каждое значение Tmid за последние хх лет по каждому индексу." Это можно тоже сразу сделать, но нужно создать второй словарь и второй массив для результатов, параллельно двум уже существующим. Пока подробно не продумывал, но вероятно алгоритм похож - как уникальные собираем связку индекс & "|" & среднее, считаем повторы. Попробуйте сами сделать - можно сперва в отдельном коде только на эту задачу, а потом совместить (если нужно сразу обе задачи выполнять) ![]()
webmoney: E265281470651 Z422237915069 R418926282008
Последний раз редактировалось Hugo121; 23.09.2011 в 10:37. Причина: Забыл про "и необходимо... |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 13.09.2011
Сообщений: 29
|
![]()
Спасибо!!!
щас сижу и пытаюсь сам сделать это. Ваше пояснение к коду помогло, т.к. не мог понять основное тело кода (никогда не сталкивался со словарем). теперь стало гораздо яснее. Как чего сделаю - отпишусь. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 07.03.2010
Сообщений: 796
|
![]()
Игорь на ADO есть не только Варианты, но и готовое "многоотчетное" решение, предложение отправил в личку
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
|
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 11.05.2010
Сообщений: 5,170
|
![]()
Я только ЗА - больше решений, хороших и разных!
![]()
webmoney: E265281470651 Z422237915069 R418926282008
|
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Дан динамический массив строк, вывести все слова начинающиеся с большой буквы C++ builder | Memphi[s] | Помощь студентам | 0 | 02.03.2011 16:34 |
Большой объем данных | matanga | Microsoft Office Excel | 4 | 09.12.2010 13:14 |
SQL - обьединение и управление несколькими базами данных | MarinN | SQL, базы данных | 1 | 08.11.2010 10:09 |
Как виделить большой кусок памяти под массив? | Tania | Мультимедиа в Delphi | 7 | 23.04.2010 01:53 |
Поиск min/max данных с несколькими условиями - нужна помощь! | /nort/ | Microsoft Office Excel | 3 | 16.03.2008 00:13 |