Как разделить цветовые коды, используемые mIRC пользователями?

У меня есть лучшее решение этой проблемы, я думаю.

Я покажу несколько изображений, чтобы поддержать и объяснить окончательное решение.

Фон В моем решении у меня есть таблица курсов валют. Они представляют рыночные курсы для разных валют. Однако у нашего поставщика услуг возникли проблемы с подачей тарифов, поэтому некоторые тарифы имеют нулевые значения. Я хочу заполнить недостающие данные курсами для той же валюты, которые как можно ближе по времени к отсутствующему курсу. В основном я хочу получить RateId для ближайшей ненулевой ставки, которую я затем заменю. (Это не показано здесь в моем примере.)

1) Итак, для начала давайте определим информацию о пропущенных ставках:

Запрос, показывающий мои пропущенные ставки т. е. имеют значение скорости, равное нулю

2) Далее давайте определим скорости, которые не пропущены. Запрос, показывающий скорости, которые не пропущены.

3) В этом запросе происходит волшебство. Здесь я сделал предположение, которое можно удалить, но которое было добавлено для повышения эффективности / производительности запроса. Предположение в строке 26 состоит в том, что я ожидаю найти замещающую транзакцию в тот же день, что и транзакция с отсутствующим / нулевым значением. Волшебство происходит в строке 23: функция Row_Number добавляет автоматический номер, начинающийся с 1, для кратчайшей разницы во времени между отсутствующей и отсутствующей транзакцией. Следующая ближайшая транзакция имеет значение rownum 2 и т. Д.

Обратите внимание, что в строке 25 я должен объединить валюты, чтобы не нарушать типы валют. То есть я не хочу заменять валюту AUD значениями CHF. Я хочу самые близкие совпадающие валюты.

Объединение двух наборов данных с row_number для идентификации ближайшей транзакции

4) Наконец, давайте получим данные, где RowNum равен 1 Окончательный вариант query

Полный запрос запроса выглядит следующим образом:

    ; with cte_zero_rates as
(
        Select      * 
        from        fxrates
        where       (spot_exp = 0 or spot_exp = 0) 
),
cte_non_zero_rates as
(
        Select      * 
        from        fxrates
        where       (spot_exp > 0 and spot_exp > 0) 
)
,cte_Nearest_Transaction as
(
        select       z.FXRatesID    as Zero_FXRatesID
                    ,z.importDate   as Zero_importDate
                    ,z.currency     as Zero_Currency
                    ,nz.currency    as NonZero_Currency
                    ,nz.FXRatesID   as NonZero_FXRatesID
                    ,nz.spot_imp
                    ,nz.importDate  as NonZero_importDate
                    ,DATEDIFF(ss, z.importDate, nz.importDate) as TimeDifferece
                    ,ROW_NUMBER() Over(partition by z.FXRatesID order by abs(DATEDIFF(ss, z.importDate, nz.importDate)) asc) as RowNum
        from        cte_zero_rates z 
        left join   cte_non_zero_rates nz on nz.currency = z.currency
                    and cast(nz.importDate as date) = cast(z.importDate as date)
        --order by  z.currency desc, z.importDate desc
)
select           n.Zero_FXRatesID
                ,n.Zero_Currency
                ,n.Zero_importDate
                ,n.NonZero_importDate
                ,DATEDIFF(s, n.NonZero_importDate,n.Zero_importDate) as Delay_In_Seconds
                ,n.NonZero_Currency
                ,n.NonZero_FXRatesID
 from           cte_Nearest_Transaction n
 where          n.RowNum = 1
                and n.NonZero_FXRatesID is not null
 order by       n.Zero_Currency, n.NonZero_importDate

6
задан caf 16 March 2010 в 01:15
поделиться

4 ответа

На мой взгляд, лучше всего подходят регулярные выражения. Если вы не использовали их раньше, этот - хороший ресурс. Для получения полной информации о библиотеке регулярных выражений Python перейдите сюда .

import re
regex = re.compile("\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

Регулярное выражение выполняет поиск ^ C (который равен \ x03 в ASCII , вы можете подтвердить, выполнив chr (3) в командной строке), а затем при желании ищет один или два символа [0-9], затем, при желании, следует запятую, а затем еще один или два символа [0-9].

(?: ...) говорит, что нужно забыть о сохранении того, что было найдено в круглых скобках (поскольку нам не нужно ссылаться на него), ? означает соответствие 0 или 1 и {n, m} означает соответствие n и m из предыдущей группировки. Наконец, \ d означает соответствие [0-9].

13
ответ дан 8 December 2019 в 05:57
поделиться

I even had to add '\x0f', whatever use it has

regex = re.compile("\x0f|\x1f|\x02|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)
regex.sub('', msg)
0
ответ дан 8 December 2019 в 05:57
поделиться

Поскольку я нашел этот вопрос полезным, я решил внести свой вклад.

Я добавил пару вещей в regex

regex = re.compile("\x1f|\x02|\x03|\x16|\x0f(?:\d{1,2}(?:,\d{1,2})?)?", re.UNICODE)

\x16 убрал символ "reverse". \x0f избавился от другого жирного символа.

1
ответ дан 8 December 2019 в 05:57
поделиться

Второе и следующие предложения являются ошибочными, так как ищут цифры после любого символа, но не после символа цветового кода.

Я улучшил и объединил все сообщения, что привело к следующим последствиям:

  • мы делаем удаление обратного символа
  • удаляем цветовые кодыне оставляя цифры в тексте.

Solution:

regex = re.compile("\x1f|\x02|\x12|\x0f|\x16|\x03(?:\d{1,2}(?:,\d{1,2})?)?", re. UNICODE)

7
ответ дан 8 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: