0

私はストリームベースを使用しており、受信整数 (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 でこれを行うより良い方法はありますか?

4

1 に答える 1

1

初期調査では、StreamBase Expression Language または組み込み関数には、ASCII 文字値を表す int を ASCII 値に対応する 1 文字の文字列に変換する明確な方法がないことが確認されています。後で発見した自明ではないトリックがある場合は、戻ってこの回答を編集します。

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 にとどまりたい場合は、次の 2 つの方法が思い浮かびます。

  1. int -> string マッピングを含む CSV ファイルをクエリ テーブルにロードし、Query Read 演算子を使用してルックアップします。ASCII はすぐには変更されないため、[Initial Contents] タブを使用して CSV ファイルを参照します。
  2. 変換したいすべての文字列を含むASCIIなどと呼ばれるリスト定数を作成し、intでリストにインデックスを付けます。たとえば、Map 演算子では Add c ASCII[i] を実行し、いくつかの境界チェック ロジックを (おそらくユーザー関数で) 追加します。

開示/免責事項: 私は TIBCO Software, Inc. の従業員です。ここで表明された意見は私自身のものであり、TIBCO のものではありません。

于 2015-10-06T20:50:05.863 に答える