🏋️‍♀️

WebFOCUSでPython関数を利用する

2025/01/15に公開

WebFOCUSでPython関数が使えると出来るようになること

  • データ解析
    • pandasなどを使って簡単にデータ解析を行える
  • 自動化
    • サーバ側で動くサブルーチンとして利用できる
  • 情報収集
    • スクレイピングによりWebサイトから情報を収集できる

Python関数構文

PYTHON(Python_MFD[, input_field1[, input_field2[, ...]]], output_field)

  • Python_MFD: APP名/シノニム名

  • input_field1: python関数で定義したcsvinの列1に渡す項目

  • input_field1: python関数で定義したcsvinの列2に渡す項目(任意の個数)

  • output_field: python関数で定義したcsvoutの出力したい列名

    • 例文
      COMPUTE OUTPUT/I9 = PYTHON(python/newfunc_kakezan,NO1,NO2,seki);

Python関数サンプル

kakezan.py
import csv
def kakezan(csvin, csvout):
    with open(csvin,  'r', newline='') as file_in,\
         open(csvout, 'w', newline='') as file_out:
        fieldnames = ['col1', 'col2', 'seki']
        reader = csv.DictReader(file_in, quoting=csv.QUOTE_NONNUMERIC)
        writer = csv.DictWriter(file_out, quoting=csv.QUOTE_NONNUMERIC,
                                fieldnames=fieldnames)
        writer.writeheader()
        for row in reader:
            ret1 = row['col1'] * row['col2']
            writer.writerow({
                'col1': row['col1'],
                'col2': row['col2'],
                'seki': ret1
            })

WebFOCUS用Python関数のポイント

  1. プログラム内にmainを含めず関数のみを宣言する

  2. 関数の引数は、入出力ともにcsvファイルとなるので(csvin, csvout)固定となる

  3. with句も同様に固定となる

    def kakezan(csvin, csvout):
        with open(csvin,  'r', newline='') as file_in,\
             open(csvout, 'w', newline='') as file_out:
    
  4. fieldnamesには、WebFOCUSのPYTHON関数でoutput_fieldとして指定する項目を指定

        fieldnames = ['col1', 'col2', 'seki']
    
  5. readerとwriterは、入出力の形式に沿った記述とする(例では入出力ともに数値型)

            reader = csv.DictReader(file_in, quoting=csv.QUOTE_NONNUMERIC)
            writer = csv.DictWriter(file_out, quoting=csv.QUOTE_NONNUMERIC,
                                    fieldnames=fieldnames)
    
  6. 必ずヘッダー付でcsv出力する

            writer.writeheader()
    
  7. 処理部分は自由に記述するが、csvinと同じ行数をcsvoutに出力する

            for row in reader:
                ret1 = row['col1'] * row['col2']
                writer.writerow({
                    'col1': row['col1'],
                    'col2': row['col2'],
                    'seki': ret1
                })
    

WebFOCUS側の設定

Pythonアダプタを作成

  1. WebFOCUSのアダプタとしてPythonアダプタを追加する
    • PythonインストールディレクトリはWebFOCUSサーバに同梱されているpythonのパスを登録する
      C:\ibi\srv90\home\etc\python
  1. WebFOCUS Reportingサーバを再起動する

関数アクセス用シノニムを作成

  1. シノニム作成用サンプルCSVを準備する
    • python関数開発時に利用したもので問題ない(件数は任意)
    • タイトル付のCSVを作成する
    • 関数のcsvinで定義した列名を必ず含める
    • 拡張子はcsv
    • 他の関数用サンプルと兼用するため、csvinで利用しない項目を含んでも良い
    sample.csv
    "col1","col2","col3","col4"
    1,2,3,4
    2,3,4,5
    10,20,30,40
    100,200,300,400
    
  2. 利用する関数を含む**.pyファイルサンプルCSV**を有効なAPPパスに配置
  3. PYTHONアダプタからシノニムを作成
    • Pythonスクリプト: 利用する関数を含むpyファイルを選択
    • 関数名: pyファイルに含まれる関数名を選択
    • Pythonスクリプトのサンプル入力データファイル: 1.で作成したcsvファイルを選択
    • ヘッダ付きCSVファイル: サンプルCSVとcsvoutともにヘッダ付きを想定しているので入力・出力ともに✅をつける
    • アプリケーション: Python_MFDの保存場所(有効なパスにを選択)
    • シノニム名: Python_MFDの名称(関数内で指定する名称)
  4. 作成時にエラーが発生しなければ、WebFOCUSでPYTHON関数として利用できる

動作確認

kakezan.pyとsample.csvをapps/pythonフォルダに配置し、Python_MFDをapps/pythonフォルダにnewfunc_kakezanの名称で作成している前提

test.fex
DEFINE FILE SYSTABLE
 NO1/P20 = NO1 + 1;
 NO2/P20 = 5;
END
TABLE FILE SYSTABLE
 PRINT NAME  NO1  NO2
 COMPUTE 出力/P20 = PYTHON(python/newfunc_kakezan, NO1, NO2, SEKI);
END

PYTHON(Python_MFD[, input_field1[, input_field2[, ...]]], output_field)

  • Python_MFD: python/newfunc_kakezan(apps/pythonフォルダにnewfunc_kakezan.masがある)
  • input_field1,inputfield2: csvinで読み込む項目が2つあるため、col1,col2として2つの数値項目を指定
  • output_field: csvoutに含まれる項目のうち一つを指定(SEKI)

Discussion