Как преобразовать целые числа ASCII в строку в Streambase?
Я использую streambase и создал карту для преобразования входящих целых чисел (0-255) в коды символов. Прямо сейчас я использую инструкции if/else вручную. Например:
if (message_code == '106') then
message_code = 'J'
else if (message_code == '110') then
message_code= 'N'
Однако я бы хотел использовать это более широко. Насколько я мог судить, поиск по справке Streambase Studio ничего не дал. Я знаю, что это может быть сделано в Java, но, вероятно, потребует вызова внешней функции Java. Я не настолько компетентен в этом, поэтому немного растерялся.
Есть ли лучший способ сделать это в StreamBase?
1 ответ
Первоначальные исследования подтверждают, что язык выражений StreamBase или встроенные функции не имеют очевидного способа преобразования целых чисел, представляющих символьные значения ASCII, в односимвольную строку, соответствующую значению ASCII. Если позже я обнаружу неочевидный трюк, я вернусь и отредактирую этот ответ.
Я бы точно не использовал 255-выражение if/then/else!
Я бы, вероятно, использовал функцию Java, и вот пример, который я слегка протестировал:
package example;
public class ASCIIIntToString {
public static String ASCIIToString(Integer a) {
if (a == null || a < 0 || a > 255) {
return null;
} else {
return Character.toString((char) (int) a);
}
}
}
И объявление пользовательской функции, которое нужно поместить в ваш sbd.sbconf, будет выглядеть так:
<custom-functions>
<custom-function alias="ASCIIToString"
args="auto"
class="example.ASCIIIntToString"
language="java"
name="ASCIIToString"
type="simple"/>
</custom-functions>
Но если вы предпочитаете не заходить в Java и оставаться в EventFlow, на ум приходят два метода:
- Загрузите файл CSV с отображениями строк int -> в них в таблицу запросов и выполните поиск с помощью оператора Query Read, возможно, с помощью вкладки "Начальное содержимое" для ссылки на файл CSV, поскольку ASCII в ближайшее время не изменится.
- Создайте константу списка, скажем, ASCII, которая содержит все строки, в которые вы хотите преобразовать, и индексируйте список с помощью int. Например, в операторе Map выполните Add c ASCII[i] и добавьте логику проверки границ (возможно, в пользовательской функции).
Раскрытие информации / отказ от ответственности. Я являюсь сотрудником TIBCO Software, Inc. Мнения, высказанные здесь, принадлежат мне, а не компании TIBCO.