#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)).