Журнал LinuxFormat - перейти на главную

LXF94:Макрос, загружающий данные

Материал из Linuxformat
Перейти к: навигация, поиск

Содержание

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, который (если его открыть) покажет свежескачанные данные.

В командную строку!

Представляем графики

Персональные инструменты
купить
подписаться
Яндекс.Метрика