Извлечение чисел из строки Webi BO

#business-objects #webi

#бизнес-объекты #webi

Вопрос:

Я почти новичок в Webi BO. Мне нужно извлечь числа из строки. Строка выглядит следующим образом: x Y Z, где x — текст переменной длины, Y — требуемое число для извлечения (также может различаться по длине 0, или 00, или 000, или 0.00, 00.00 или 000.0, … и Z — текст фиксированной длины из 5 символов.

пример для строки:

 sodium chloride 0.9%   Potassium chloride 50 mL/hr
 

x — хлорид натрия 0,9% хлорид калия
Y равно 50
Z — это мл / час

Необходимо извлечь значение Y. Есть ли какая-либо формула, которая поможет в этом отношении? Спасибо.

Ответ №1:

Это изначально невозможно в Web Intelligence. Поскольку X имеет переменную длину, а Z — фиксированную длину, единственный способ решить эту проблему — найти пробел перед Y, что возможно, если мы перевернем строку. Однако в WebI нет обратной функции. Не могли бы вы сделать это в своем юниверсе или в свободном SQL?

Вот как это будет выглядеть в SQL Server…

 DECLARE @MyString VARCHAR(100);
DECLARE @Length INT;
DECLARE @Y_Index INT;
DECLARE @Y_Length INT;
DECLARE @Z_Index INT;

SET @MyString = 'sodium chloride 0.9%   Potassium chloride 50 mL/hr';
-- get total string length
sET @Length = LEN(@MyString);

-- find index (starting position) of Y
SET @Y_Index = @Length - CHARINDEX(' ', REVERSE(@MyString), 7)   2;

-- find index (starting position) of Z
SET @Z_Index = @Length - CHARINDEX(' ', REVERSE(@MyString))   2;

SELECT
    @MyString                                                  AS [MyString]
  , REVERSE(@MyString)                                         AS [MyStringReversed]
  , @Length                                                    AS [MyStringLength]
  , @Y_Index                                                   AS [Y Index]
  , @Z_Index                                                   AS [Z Index]
  , RTRIM(SUBSTRING(@MyString, @Y_Index, @Z_Index - @Y_Index)) AS [Y];
 

Вот ссылка, чтобы увидеть это в действии.

Комментарии:

1. Строковая функция для поиска строки в обратном порядке, называемая RpoS, была выпущена в версии 4.3 SP1 . Если у вас есть эта версия или выше, мое решение может быть адаптировано к ней.

2. Спасибо Issac, но, как уже упоминалось, я очень новичок в Webi, и у меня недостаточно опыта работы с SQL-кодами, я попробовал другой обходной путь в 2 шага: сначала удалил » mL / hr» с помощью функции ниже в переменной Step1, = Right( Replace([Main String]; » mL / hr» ;»») ;6), поэтому основная строка сокращается до нескольких символов с хотя бы одним пробелом перед цифрами, затем в другой переменной Step2 я использовал =ToNumber(Substr( [Step1] ;Pos( [Step1] ;» «) 1;99)).