LXF94:Макрос, загружающий данные
Lodger (обсуждение | вклад) (→Первый макрос) |
Lodger (обсуждение | вклад) (→В командную строку!) |
||
Строка 105: | Строка 105: | ||
=== В командную строку! === | === В командную строку! === | ||
+ | |||
+ | В начале этой статьи я говорил, что все это можно делать, не открывая OpenOffice.org (кроме как для просмотра результата). Давайте выясним, как этого достичь. Узнав, как автоматически открывать и сохранять наш файл, вы сумеете это сделать и без отображения результатов. Начнем с добавления строки кода в конец макроса download_stock_price: | ||
+ | |||
+ | oDoc.close(true) | ||
+ | |||
+ | Она всего-навсего закрывает документ. Если вы запустите Main, то увидите, что документ откроется и сразу же закроется. Зачем мы начали с этого? Да просто чтобы удостовериться, что у нас не останется никаких сессий в фоновом режиме, когда мы приступим к изменениям, которые спрячут наш документ. | ||
+ | |||
+ | Вы уже знаете, как открыть CSV-документ, не используя мастер импорта, установкой соответствующих свойств, и, по-моему, нетрудно | ||
+ | сообразить, что открытие документа в невидимом режиме происходит точно так же. Итак, назад к функции open_csv_file. Сначала переопределим свойства, намеченные для использования: | ||
+ | |||
+ | Dim oProperty(1) as New com.sun.star.beans.PropertyValue | ||
+ | |||
+ | Затем укажем детали для нового свойства: | ||
+ | |||
+ | oProperty(1).Name = “Hidden” | ||
+ | oProperty(1).Value = True | ||
+ | |||
+ | Проделав изменения в коде, нажмите на кнопку запуска... и опять ничего. Не пугайтесь. Проверьте: | ||
+ | |||
+ | bainm@aeneas:~> ls -l /tmp/test_lxf94.ods | ||
+ | -rw-r--r-- 1 bainm users 6455 2007-04-23 09:00 /tmp/test_lxf94.ods | ||
+ | |||
+ | Теперь запустите макрос и снова проверьте. Вы увидите, что файл действительно изменился: | ||
+ | |||
+ | bainm@aeneas:~> ls -l /tmp/test_lxf94.ods | ||
+ | -rw-r--r-- 1 bainm users 6454 2007-04-23 09:01 /tmp/test_lxf94.ods | ||
+ | |||
+ | Это значит, что вы можете запускать процессы незримо, но (в настоящий момент) надо держать OpenOffice.org открытым, чтобы запускать макрос. А надо ли? Нет! Закройте все экземпляры OOo и наберите в командной строке: | ||
+ | |||
+ | scalc -headless “macro:///Standard.lxf94.Main” | ||
+ | |||
+ | Абсолютно ничего не произойдет – вы даже не увидите экрана OpenOffice.org. Однако если вы запустите ls -l и посмотрите на файл, то заметите перемены. | ||
+ | |||
+ | Для завершения процедуры автоматизации, создадим задачу Cron: тогда уже не придется беспокоиться о запуске макроса. Например, поставим задание Cron на запуск каждый день в 8:45, и в 9 утра к вашему приходу уже будет новый файл. Чтобы это сделать, откройте командную строку. Наберите crontab -e, а затем: | ||
+ | |||
+ | 45 8 * * * scalc -headless “macro:///Standard.lxf94.Main” | ||
+ | |||
+ | Далее нажмите Control-D, чтобы сохранить файл Cron. И все – загрузка ваших котировок полностью автоматизирована. | ||
=== Представляем графики === | === Представляем графики === |
Версия 16:03, 11 марта 2008
|
|
|
Содержание |
Calc: Макрос для чтения данных
Перелопатили все биржевые котировки, только чтоб убедиться: BMW вам уже не купить? Марк Бэйн упростит вам жизнь...
Надеюсь, ваши акции поживают лучше, чем мои – если нет, вам остается только ронять слезы в пиво. Но не падайте духом! Здесь в Linux Format мы, может, и не улучшим ваши навыки по прогнозированию котировок, зато вы с ходу будете видеть, насколько плохи ваши дела.
Поможет, конечно же, OpenOffice.org. На нашем уроке мы сперва рассмотрим, как загрузить финансовую статистику с сайта прямо в таблицу Calc; затем – как по этим данным построить график; а в завершение научимся все это делать автоматически. Фактически, вы сумеете это делать, даже не открывая OOo (кроме как для просмотра результатов). Вообще-то, говоря, что вам не придется открывать OpenOffice.org, я имею в виду, что нужно будет написать пару макросов – но затем вы и вправду сможете обрабатывать данные без открытия OOo.
В любом случае, перво-наперво найдем финансовую статистику. У вас могут быть свои источники – ну, а мы воспользуемся финансовым порталом Yahoo Finance. Если вам безразличны финансовые сводки, не спешите захлопнуть страницу: навыки, полученные здесь, применимы и к другим источникам данных. Однако для целей нашего урока, алчность – это хорошо!
Получаем данные
Вы найдете Yahoo Finance по адресу http://finance.yahoo.com, им довольно легко пользоваться – там есть окошко, содержащее слова Enter Symbol(s) [Введите Символ(ы)] и кнопка с названием Get Quotes [Получить котировки]. Все, что вам надо сделать, это ввести символ компании, в которой вы заинтересованы; Yahoo Finance предоставляет ссылку, которая даст вам этот символ. Например, символ Microsoft на Лондонской фондовой бирже – MSFL. Как только вы введете этот символ и нажмете Получить Котировки, вы увидите самые последние данные о фирме. А сейчас начнется самое интересное: скачаем их!
Взглянув на экран котировок, вы увидите ссылку Скачать Данные [Download Data]. По ней мы добудем URL самих данных: http://download.finance.yahoo.com/d/quotes.csv?s=MSF.L&f=sl1d1t1c1ohgv&e=.csv. А зачем нам URL? Затем, что теперь можно в любой момент набрать его в браузере. Времени тут экономится немного, но главное – начать.
На следующем шаге мы сэкономим гораздо больше времени. Если вы нажмете на Скачать Данные или напечатаете URL, Calc загрузит CVS-файл в мастер импорта. С его помощью вы можете указать разделители данных в файле OpenOffice.org (в нашем случае это, очевидно, будут запятые), а затем OOo поместит каждое поле в свой столбец. Пока ничего нового – вы, возможно, проделывали такое уже сотни раз. Но вместо ручного ввода лучше написать макрос.
Первый макрос
Вы уже поняли, что можно получить котировки акций, написав символ, представляющий фирму, как часть URL в вашем браузере, а затем загрузить их как CSV-файл в OOo Calc через мастер импорта. Теперь, прежде чем писать макрос для импорта, проанализируем импортируемые данные. Заметьте, что поля, которые скачиваются, определяются параметром ‘f’ в URL. Поэкспериментировав с ними, вы поймете, как работает каждое из них, но сейчас нам нужны только три: ‘s’, название фирмы, ‘l1’, последняя цена продажи, и ‘d1’, последняя дата сделки. Таким образом, наш URL превращается в http://download.finance.yahoo.com/d/quotes.csv?s=MSF.L&f=sl1d1&e=.csv, его мы и будем использовать в макросе.
ОК, пора писать макрос. Откройте OpenOffice.org (неважно, какое приложение – сгодится Calc или Writer), затем нажмите Tool > Macros > Organize Macros > OpenOffice.org Basic. Здесь есть список языков на выбор (Basic, Python, BeanShell или JavaScript), но нам сейчас нужен Basic. Появится диалоговое окно, в нем надо нажать на кнопку Organizer. Откроется другой диалог, со вкладкой Module; выберите пункт Standard. Вы, небось, уже недоумеваете: да зачем вообще? – а дело-то простое. Standard – библиотека; в библиотеках хранятся модули; в модулях хранятся макросы. Дошло? Тогда жмите на New, чтобы создать свой собственный модуль в библиотеке Standard.
Нажав на New, вы увидите, что OOo предложит имя вашему модулю: ‘Module1’. Не используйте его. Довольно нудно работать с модулями, названными Module1, Module2, Module3, и так до бесконечности. Лучше дать модулю значимое имя – например, свой я назвал ‘lxf94’ (угадайте, почему). В новом модуле нажмите Edit, и OOo откроет экран редактирования Basic – именно тут мы и создадим макрос.
Тут вы обнаружите, что OpenOffice.org уже создал для вас макрос с именем Main. Предупреждаю: не путайте его с Main, знакомым вам по другим языкам программирования. Здесь это просто пустой макрос, чтобы OpenOffice.org было с чем работать, когда вы нажмете кнопку запуска (на ней изображены угол страницы и стрелка, указывающая вниз). На самом деле OOo запустит первый же макрос, который найдет в модуле. Например, если поместить Main1 выше Main, то он и будет запущен.
Вооруженные этими знаниями, мы готовы писать макрос (поместите этот код после процедуры Main):
Function open_csv_file (url as String) as Object Dim oProperty(0) as New com.sun.star.beans.PropertyValue oProperty(0).Name = “FilterOptions” oProperty(0).Value = “44” open_csv_file = starDeskTop.loadComponentFromUrl(url, “_blank”, 0, oProperty()) End Sub
Созданная функция загружает любой CSV-файл без всякого мастера импорта, используя свойство FilterOptions при установке его значения в 44. Почему 44? Потому что 44 – это код ASCII для… верно, для запятой. А зачем здесь функция? Затем, что open_csv_file создает объект – сам документ – а нам потребуется к нему доступ из кода.
Если вы теперь попробуете запустить код, то ничего не произойдет – потому что Main пока ничего не содержит. Заставим его поработать:
Sub Main Dim oDoc as Object oDoc = open_csv_file _(“http://download.finance.yahoo.com/d/quotes.csv?s=MSF.L&f=sd1l1&e=.csv”) End Sub
Теперь при нажатии на кнопку запуска произойдет следующее: после пары секунд ожидания (в зависимости от скорости соединения) появится файл Calc, содержащий последние цены на акции для Microsoft на Лондонской фондовой бирже. Уже неплохо, но вы явно думаете «Не проделывать же это для каждой из моих акций – хорошо бы отобразить сразу весь мой портфель.» Отлично, этим и займемся.
Макрос для групповухи
Мы уже видели, как легко автоматизировать загрузку данных по одной фирме. Чтобы сделать тоже самое для их группы, надо просто разжиться новым символом и добавить его в URL. Например, если нас интересует Novell, добавим символ NOVL; наш URL станет таким: http://download.finance.yahoo.com/d/quotes.csv?s=MSF.L&s=NOVL&f=sd1l1&e=.csv. Ради этой новой информации модифицируем наш код. Начнем с добавки новой процедуры – она упростит нам жизнь:
Sub download_stock_price(companySymbols) Dim oDoc as Object Dim cSymbols as String, oUrl as String cSymbols = join(companySymbols, “&s=”) oUrl = “http://download.finance.yahoo.com/d/quotes.csv?s=” _ & cSymbols & “&f=sl1d1&e=.csv” oDoc = open_csv_file(oUrl) End Sub
Вы заметите, что новый макрос принимает companySymbols как параметр – это будет массив, содержащий список кодов фирм.
Процедура соединяет все символы в единую строку (с &s= между каждым символом), а затем создает правильный URL для заготовленной нами функции open_csv_file. После создания нового макроса изменим процедуру Main, чтобы она принимала массив фирм:
Sub Main download_stock_price(array(“MSF.L”,”NOVL”)) End Sub
Когда на этот раз вы нажмете кнопку запуска, то увидите файл Calc, содержащий детали всех фирм, указанных в списке – и, конечно, можете добавить столько символов фирм, сколько душе угодно.
Сохраняем файл
Следующий этап автоматизации – сохранение файла на жесткий диск. Чтобы это сделать, опять напишем макрос:
Sub save_file_as_ods(doc as Object, directory as String, prefix as String) Dim oUrl as String oUrl = convertToUrl(directory & “/” & prefix & “.ods”) doc.storeAsUrl(oUrl,Array()) End Sub
Здесь следует обратить внимание на пару моментов: во-первых, на функцию convertToUrl. При открытии и закрытии файлов макросу требуется имя файла в определенном формате – и convertToUrl делает для вас это преобразование. Во-вторых, вы увидите, что наравне с каталогом и префиксом файла (то есть именем файла без расширения ‘.ods’) процедуре также передается doc. Это имя объекта, созданного с помощью функции open_csv_file.
Далее вам надо немного изменить функцию download_stock_price.
Добавьте следующую строку в конец процедуры:
save_file_as_ods(oDoc, “/tmp”, “test_lxf94”)
На этот раз, запустив Main, вы увидите, что ваш документ переименован в test_lxf94, а если вы заглянете в каталог /tmp, то найдете файл test_lxf94.ods, который (если его открыть) покажет свежескачанные данные.
В командную строку!
В начале этой статьи я говорил, что все это можно делать, не открывая OpenOffice.org (кроме как для просмотра результата). Давайте выясним, как этого достичь. Узнав, как автоматически открывать и сохранять наш файл, вы сумеете это сделать и без отображения результатов. Начнем с добавления строки кода в конец макроса download_stock_price:
oDoc.close(true)
Она всего-навсего закрывает документ. Если вы запустите Main, то увидите, что документ откроется и сразу же закроется. Зачем мы начали с этого? Да просто чтобы удостовериться, что у нас не останется никаких сессий в фоновом режиме, когда мы приступим к изменениям, которые спрячут наш документ.
Вы уже знаете, как открыть CSV-документ, не используя мастер импорта, установкой соответствующих свойств, и, по-моему, нетрудно сообразить, что открытие документа в невидимом режиме происходит точно так же. Итак, назад к функции open_csv_file. Сначала переопределим свойства, намеченные для использования:
Dim oProperty(1) as New com.sun.star.beans.PropertyValue
Затем укажем детали для нового свойства:
oProperty(1).Name = “Hidden” oProperty(1).Value = True
Проделав изменения в коде, нажмите на кнопку запуска... и опять ничего. Не пугайтесь. Проверьте:
bainm@aeneas:~> ls -l /tmp/test_lxf94.ods -rw-r--r-- 1 bainm users 6455 2007-04-23 09:00 /tmp/test_lxf94.ods
Теперь запустите макрос и снова проверьте. Вы увидите, что файл действительно изменился:
bainm@aeneas:~> ls -l /tmp/test_lxf94.ods -rw-r--r-- 1 bainm users 6454 2007-04-23 09:01 /tmp/test_lxf94.ods
Это значит, что вы можете запускать процессы незримо, но (в настоящий момент) надо держать OpenOffice.org открытым, чтобы запускать макрос. А надо ли? Нет! Закройте все экземпляры OOo и наберите в командной строке:
scalc -headless “macro:///Standard.lxf94.Main”
Абсолютно ничего не произойдет – вы даже не увидите экрана OpenOffice.org. Однако если вы запустите ls -l и посмотрите на файл, то заметите перемены.
Для завершения процедуры автоматизации, создадим задачу Cron: тогда уже не придется беспокоиться о запуске макроса. Например, поставим задание Cron на запуск каждый день в 8:45, и в 9 утра к вашему приходу уже будет новый файл. Чтобы это сделать, откройте командную строку. Наберите crontab -e, а затем:
45 8 * * * scalc -headless “macro:///Standard.lxf94.Main”
Далее нажмите Control-D, чтобы сохранить файл Cron. И все – загрузка ваших котировок полностью автоматизирована.