Несмотря на то, что эта тема прекрасна раскрыта в Интернете, дам несколько ссылок, так сказать, чтобы под рукой было :)
Получение данных с сайта ЦБ РФ используя XML (http://www.cbr.ru/scripts/Root.asp?PrtId=SXML)
Как мы знаем, Qlikview прекрасно работает с XML-источниками, поэтому ничего далее сложного нет.
Формируем необходимые ссылки и подставляем их в качестве источника web-файла Qlikview.
Для котировок всех валют на один день:
http://www.cbr.ru/scripts/XML_daily.asp?date_req=27/11/2014 (http://www.cbr.ru/scripts/XML_daily.asp?date_req=27/11/2014)
или для динамики курса , например доллара
http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=01/11/2014&date_req2=27/11/2014&VAL_NM_RQ=R01235 (http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=01/11/2014&date_req2=27/11/2014&VAL_NM_RQ=R01235)
ID валюты (VAL_NM_RQ) можно получить по ссылке http://www.cbr.ru/scripts/XML_val.asp?d=0 (http://www.cbr.ru/scripts/XML_val.asp?d=0)
Курсы валют относительно Евро от Европейского ЦБ
Текущий - http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml (http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml)
История - http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml (http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml)
Пример скрипта для получения динамики курсов валют с сайта ЦБ РФ на каждый календарный день, включая выходные и праздничные дни с применением функции peek().
let vDateStart = date('01.01.2014','DD/MM/YYYY');
let vDateEnd = date(today(),'DD/MM/YYYY');
set vURLHist='http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=$(vDateStart)&date_req2=$(vDateEnd)&VAL_NM_RQ=';
set vVALID='R01235';
TmpRate:
LOAD Date,
Id,
Nominal,
Value
FROM [$(vURLHist)$(vVALID)] (XmlSimple, Table is [ValCurs/Record]);
MinMaxDate:
Load Min(Date) as MinDate, Max(Date) as MaxDate resident TmpRate;
Let vMinDate = Peek('MinDate',-1,'MinMaxDate')-1;
Let vMaxDate = Peek('MaxDate',-1,'MinMaxDate');
Drop Table MinMaxDate;
Join (TmpRate) Load Date(recno()+$(vMinDate)) as Date Autogenerate vMaxDate - vMinDate;
Rates:
NoConcatenate Load Date,
If(IsNull(Id), Peek(Id), Id) as Id,
If(IsNull(Nominal), Peek(Nominal), Nominal) as Nominal,
if(IsNull(Value), Peek(Value), Value) as Value
Resident TmpRate
Order By Date ;
DROP Table TmpRate;
Работает в Qlikview и в QLIK SENSE (только в устаревшем режиме).
Всем привет!
Я для ежедневного обновления курсов непосредственно с cbr.ru с накоплением данных в файле использовал следующий скрипт (правда, cbr.ru периодически меряет структуру страницы (есть строки в комментариях от 2015/10/05 например). Вытаскиваются USD и EUR.
PS В конце кода еще формирование строки с праздниками для функций вычисления интервалов дат.
temp_currency1:
load 'USD' as Currency_temp1,
@3 as ExchangeDate_temp1
FROM
[http://www.cbr.ru/]
//(html, utf8, no labels, table is @2)
//(html, utf8, no labels, table is @4) 2015/10/05
(html, utf8, no labels, table is @3)
where len(trim(@1))=0;
left join
load 'USD' as Currency_temp1,
replace(mid(trim(@3),index(trim(@3),chr(32))+2),',','.') as ExchangeRate_temp1
FROM
[http://www.cbr.ru/]
//(html, utf8, no labels, table is @2)
//(html, utf8, no labels, table is @4) 2015/10/05
(html, utf8, no labels, table is @3)
where replace(lower(@1),'доллар','')<>lower(@1);
temp_currency2:
load 'EUR' as Currency_temp2,
@3 as ExchangeDate_temp2
FROM
[http://www.cbr.ru/]
//(html, utf8, no labels, table is @2)
//(html, utf8, no labels, table is @4) 2015/10/05
(html, utf8, no labels, table is @3)
where len(trim(@1))=0;
left join
load 'EUR' as Currency_temp2,
replace(mid(trim(@3),index(trim(@3),chr(32))+2),',','.') as ExchangeRate_temp2
FROM
[http://www.cbr.ru/]
//(html, utf8, no labels, table is @2)
//(html, utf8, no labels, table is @4) 2015/10/05
(html, utf8, no labels, table is @3)
where replace(lower(@1),'евро','')<>lower(@1);
ExchangeRates_tmp:
load Currency_temp1 as Currency_tmp,
ExchangeDate_temp1 as ExchangeDate_tmp,
ExchangeRate_temp1 as ExchangeRate_tmp
resident temp_currency1;
concatenate
load Currency_temp2 as Currency_tmp,
ExchangeDate_temp2 as ExchangeDate_tmp,
ExchangeRate_temp2 as ExchangeRate_tmp
resident temp_currency2;
drop table temp_currency1;
drop table temp_currency2;
let vExchangeRatesFileName2 = 'ExchangeRates_history_'& replace(replace(timestamp(now(), 'YYYY.MM.DD_hh:mm:ss'),':',''),'.','')&'.csv';
store ExchangeRates_tmp into $(vExchangeRatesFileName2) /*ExchangeRates_history2.qvd*/ (txt, delimiter is '\t'); ;
drop table ExchangeRates_tmp;
ExchangeRates_History_tmp:
load * inline [
Currency_tmp, ExchangeDate_tmp, ExchangeRate_tmp
];
FOR Each File in filelist ('ExchangeRates_history_*_*.csv')//(Root&' \*.' &Ext)
ExchangeRates_History_tmp:
add LOAD
Currency_tmp,
date(ExchangeDate_tmp) as ExchangeDate_tmp,
ExchangeRate_tmp
FROM
'$(File)'
(txt, utf8, embedded labels, delimiter is '\t', msq);
NEXT File
ExchangeRatesHistory:
load distinct
Currency_tmp as Currency,
ExchangeDate_tmp as ExchangeDate,
ExchangeRate_tmp as ExchangeRate
resident ExchangeRates_History_tmp;
drop table ExchangeRates_History_tmp;
FOR Each File in filelist ('ExchangeRates_history_*_*.csv')//(Root&' \*.' &Ext)
execute cmd.exe /c del "$(File)";
NEXT File
let vExchangeRatesFileName2 = 'ExchangeRates_history_'& replace(replace(timestamp(now(), 'YYYY.MM.DD_hh:mm:ss'),':',''),'.','')&'.csv';
store Currency as Currency_tmp,
ExchangeDate as ExchangeDate_tmp,
ExchangeRate as ExchangeRate_tmp from ExchangeRatesHistory into $(vExchangeRatesFileName2) /*ExchangeRates_history2.qvd*/ (txt, delimiter is '\t');
Holidays:
LOAD Holidays as HolidayDate
FROM
[holidays.xlsx]
(ooxml, embedded labels, table is Sheet1);
let vHolidays='';
FOR i=0 to NoOfRows('Holidays')-1
vHolidays = vHolidays & ' ' & chr(39) & peek('HolidayDate',$(i),'SumData') & chr(39) & ',';
NEXT i
vHolidays = left(vHolidays,len(vHolidays)-1);
Привет, отлично :)
Qlikview прекрасно отрабатывает сайты с таблицами, да и не только с ними. Можно по тегам искать данные.
Есть минус - частая смена дизайна на некоторых сайтах, но не критично :)
Здравствуйте!
большое спасибо за скрипт. очень помог.
К сожалению со вчера перестал работать. Видимо опять что-то поменяли, а я не могу сообразить как модифицировать скрипт и как определяются эти "@1"-"@4".
Можете обновить?