<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; NewLISP: скрипт получения курсов валют с сайта ЦБ]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=3019</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=3019&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «NewLISP: скрипт получения курсов валют с сайта ЦБ».]]></description>
		<lastBuildDate>Wed, 08 Apr 2009 14:19:37 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[NewLISP: скрипт получения курсов валют с сайта ЦБ]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=21497#p21497</link>
			<description><![CDATA[<div class="codebox"><pre><code>(import &quot;user32.dll&quot; &quot;CharToOemA&quot;)
(import &quot;user32.dll&quot; &quot;OemToCharA&quot;)

(set-locale &quot;russian&quot;)

(setq base_url   &quot;http://www.cbr.ru/scripts/XML_daily.asp?date_req=&quot;
      arrParams  &#039;(&quot;CharCode&quot; &quot;Name&quot; &quot;Value&quot;)
      vals       (2 (main-args)))

(define (WinDos in direct)
   (letn (out (dup &quot;\000&quot; (length in)))
         (if (= ((if direct CharToOemA OemToCharA) in out) 1) out)) )

(define (load_val base-url dateval)
   (when (starts-with
            (setq xml_src (WinDos (get-url (setq url (append base-url (date dateval 0 &quot;%d.%m.%Y&quot;))) nil 10000) true))
            &quot;ERR:&quot;)
         (println &quot; ошибка загрузки &quot; url &quot;. (&quot; ((regex &quot;.+$&quot; xml_src) 0) &quot;)&quot;) (exit))
   (xml-type-tags nil nil nil nil)
   (setq sxml (xml-parse xml_src (+ 1 2 4 16)) )
   (list sxml (sxml -1 1 1 -1)) )

(define (scan-xml sx)
   (if (list? sx)
      (if (= (length sx) 1)
          (scan-xml (first sx))
          (filter (fn (x) (and (if (list? x) (not (empty? x)))
                               (not (nil? x)) ) )
             (map (fn (x) (if (and (list? x) (not (empty? x)) )
                              (if (if (symbol? (x 0))
                                      (find (name (x 0)) arrParams)
                                      (find (x 0) arrParams))
                                  x
                                  (scan-xml x))))
                 sx)))) )

(define (fltval x)
    (if (empty? vals)
        true
        (if (symbol? (last (x 0)))
            (find (name (last (x 0))) vals (fn (x y) (= (upper-case x) (upper-case y))) )
            (find (last (x 0))        vals (fn (x y) (= (upper-case x) (upper-case y))))) ) )

(define (print_val dateval x)
   (print &quot;\n&quot; dateval &quot;\n&quot; &quot;--------------------------------------------------\n&quot;
                            &quot;| Код | Наименование                   |  Курс   |\n&quot;
                            &quot;--------------------------------------------------\n&quot;)
   (map (fn (y) (println
                    (format &quot;| %-4s| %-000000000000000000000030.30s | %00007s | &quot; (list (y 0 -1)
                                                                                        (append (y 1 -1) &quot; &quot; (dup &quot;.&quot; 100))
                                                                                        (replace &quot;,&quot; (y 2 -1) &quot;.&quot;))))) x)
   (println                 &quot;--------------------------------------------------&quot;) )

(print &quot;Загрузка курсов с &quot; ( (regex &quot;(http://)?(.*?)/&quot; base_url) (* 2 3) ) &quot; ... &quot;)

(setq xml_and_dateC (load_val base_url (date-value) ) )

(when (nil? (regex &quot;([0-9][0-9]?)\.([0-9][0-9]?)\.(([0-9][0-9])?[0-9][0-9])&quot; (xml_and_dateC -1) 16))
      (println &quot;В загруженном документе дата не найдена. Выходим.&quot;) (exit))

(setq xml_and_dateB (load_val base_url (- (date-value (int $3) (int $2) (int $1) 1 0 0) (* 3600 24) ) ))

(setq vsB (filter fltval (scan-xml (first xml_and_dateB)) )
      vsC (filter fltval (scan-xml (first xml_and_dateC)) ))

(print &quot;\r&quot; (dup &quot; &quot; 50) &quot;\r&quot;)

(print_val (append &quot;Запрошенные курсы на дату: &quot; (xml_and_dateB -1)) vsB)
(print_val (append (if (= (date (date-value) 0 &quot;%d.%m.%Y&quot;) (xml_and_dateC -1))
                       &quot;Запрошенные курсы на дату: &quot;
                       &quot;Существуют курсы только на дату: &quot;)
                   (xml_and_dateC -1)) vsC)</code></pre></div><p>Скрипт выводит две таблички с курсами валют - курсы за вчерашнюю и за сегодняшнюю дату. Если сегодня курсов еще нет (так бывает по понедельникам - в понедельник действует субботний курс ЦБ), то выводится последний имеющийся курс и за предыдущую дату относительно имеющегося.</p><p>Запуск: </p><div class="codebox"><pre><code>&quot;C:\Program Files\newlisp\newlisp.exe&quot; Currency.lsp</code></pre></div><p>Можно фильтровать список валют, передавая их буквенные коды в виде параметров: </p><div class="codebox"><pre><code>&quot;C:\Program Files\newlisp\newlisp.exe&quot; Currency.lsp USD EUR</code></pre></div><p>Заодно в коде есть пример импорта и использования функции из DLL.</p>]]></description>
			<author><![CDATA[null@example.com (delpher)]]></author>
			<pubDate>Wed, 08 Apr 2009 14:19:37 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=21497#p21497</guid>
		</item>
	</channel>
</rss>
