Custom Transform の作成
Transformer ステージには、一般的な各種データ変換を実行するトランスフォームがあらかじめ定義されています。これらのトランスフォームがニーズを満たさない場合は、Groovy を使用して Custom Transform スクリプトを記述できます。この手順では、Groovy を使用して、基本的な Custom Transform を作成する方法について説明します。Groovy に関する詳細なドキュメントは、groovy-lang.org でご覧いただけます。
- Enterprise Designer で、データフローに Transformer ステージを追加します。
- [Transformer] ステージをダブルクリックします。
- [追加] をクリックします。
- [全般] の下の [カスタム] をクリックします。
- [Custom Transform 名] フィールドに、作成するトランスフォームの名前を入力します。名前は一意でなければなりません。
-
[スクリプト エディタ] をクリックします。
このエディターは、コード自動入力、パレット リスト関数およびフィールドなど、トランスフォームの開発を容易にするさまざまな機能を備えています。
タスク 手順 関数を追加するには
[関数] ウィンドウで、追加する関数をダブルクリックします。
注: エディターに表示される関数は、Custom Transform スクリプトの記述を容易にするものです。これらの関数は、本来なら Groovy コードを数行書かないと実行できない処理を実行します。これらの関数は、標準的な Groovy 関数ではありません。データフロー フィールドから値を取得するには
[入力フィールド] ウィンドウで、目的の入力フィールドをダブルクリックします。スクリプトに次の形式で追加されます。 data['FieldName']
例えば、CurrentBalance フィールドから値を取得する場合は、次の式が追加されます。
data['CurrentBalance']
データフロー フィールドの値を設定するには
スクリプト エディタに次のコードを入力します。
data['FieldName']=NewValue
例えば、Day フィールドに、PurchaseDate フィールドに含まれる曜日を設定する場合:
data['Day']=dayOfWeek(data['PurchaseDate'])
この例では、dayOfWeek() 関数を使用して、PurchaseDate フィールドの日付の値から曜日を取得し、その結果を Day フィールドに書き込んでいます。
ヒント: [出力フィールド] ウィンドウで出力フィールドの名前をダブルクリックすると、スクリプトにフィールド参照を追加できます。データフローのスクリプト変数のスコープを変更するには
スクリプト変数のスコープをデータフローの単一の入力レコードからすべての入力レコードに変更するには、次のようにスクリプトで @Field 注釈を使用します。 import groovy.transform.Field; @Field ['data type']['VariableName']= Value;
例えば、変数 RecordNumber のスコープを単一の入力レコードに設定するには、次のように指定します。int recordNumber = 1; data['Record_Number']= recordNumber; recordNumber++;
出力は次のようになります。
この変数のスコープをすべての入力レコードに変更するには、次のように指定します。import groovy.transform.Field @Field int recordNumber = 1; data['Record_Number']= recordNumber; recordNumber++;
出力は次のようになります。
数値データ タイプを使用して新しいフィールドを作成するには
スクリプト エディタに次のコードを入力します。
data['FieldName'] = new constructor;
ここで、constructor は以下のいずれかです。
- java.lang.Double(number)
- Double データ タイプのフィールドを作成します。
- java.lang.Float(number)
- Float データ タイプのフィールドを作成します。
- java.lang.Integer(number)
- Integer データ タイプのフィールドを作成します。整数を指定することによって、新しい integer フィールドを作成することもできます。例えば、次の例では、値 23 を持つ integer フィールドが作成されます。
data['MyNewField'] = 23;
- java.lang.Long(number)
- Long データ タイプのフィールドを作成します。
例えば、Double データ タイプで値 23.10 を持つ、"Transactions" という新しいフィールドを作成するには、次のように指定します。
data['Transactions'] = new com.java.lang.Double(23.10);
date または time データ タイプを使用して新しいフィールドを作成するには
スクリプト エディタに次のコードを入力します。
data['FieldName'] = new constructor;
ここで、constructor は以下のいずれかです。
- com.pb.spectrum.api.datetime.Date(year,month,day)
- date データ タイプのフィールドを作成します。例えば、December 23, 2013 は、次のようになります。
2013,12,23
- com.pb.spectrum.api.datetime.Time(hour,minute,second)
- time データ タイプのフィールドを作成します。例えば、4:15 PM は、次のようになります。
.16,15,0
- com.pb.spectrum.api.datetime.DateTime(year,month,day,hour,minute,second)
- DateTime データ タイプのフィールドを作成します。例えば、4:15 PM on December 23, 2013 は、次のようになります。
2013,12,23,16,15,0
例えば、Date データ タイプで値 December 23, 2013 を持つ、"TransactionDate" という新しいフィールドを作成するには、次のように指定します。
data['TransactionDate'] = new com.pb.spectrum.api.datetime.Date(2013,12,23);
Boolean データ タイプの新しいフィールドを作成するには スクリプト エディタに次のコードを入力します。
data['FieldName'] = true or false;
例えば、IsValidated というフィールドを作成して false に設定するには、次のように指定します。
data['IsValidated'] = false;
新しいリスト フィールドを作成するには factory.create() メソッドを使用してレコードに新しいフィールドを作成し、次に leftShift 演算子 << を使用して新しいレコードをリスト フィールドに追加します。
NewListField = [] NewRecord = factory.create() NewRecord['NewField1'] = "Value" NewRecord['NewField12'] = "Value" ... NewListField << NewRecord NewRecord = factory.create() NewRecord['NewField1'] = "Value" NewRecord['NewField12'] = "Value" ... NewListField << NewRecord data['ListOfRecords'] = NewListField
次の例では、"addresses” という新しいリスト フィールドを作成し、2 つの "address” レコードを含めています。
addresses = [] address = factory.create() address['AddressLine1'] = "123 Main St" address['PostalCode'] = "12345" addresses << address address = factory.create() address['AddressLine1'] = "PO Box 350" address['PostalCode'] = "02134" addresses << address data['Addresses'] = addresses
また、レコードのリストではなく、個々のフィールドのリストを含んだ新しいリスト フィールドを作成することもできます。次の例では、"PhoneNumbers ” という新しいリスト フィールドを作成し、自宅と職場の電話番号を含めています。
phoneNumbers = [] phoneNumbers << data['HomePhone'] phoneNumbers << data['WorkPhone'] data['PhoneNumbers'] = phoneNumbers
複数のフィールドを連結するには
+
記号を使用します。この例では、FirstName フィールドと LastName フィールドを 1 つの値に連結し、その値を FullName フィールドに格納します。String fullname = data['FirstName'] + ' ' + data['LastName']; data['FullName']=fullname;
次の例には、2 つの入力フィールド (AddressLine1 と AddressLine2) があります。これらのフィールドは連結されて、出力フィールド Address に書き込まれます。
address1 = data['AddressLine1']; address2 = data['AddressLine2']; data['Address']=address1+ ',' + address2;
フィールドをパースするには
分割文字を特定した後、
substring
を使用してフィールドをパースします。この例では、PostalCode フィールドが 6 文字以上の場合に、フィールドを 5 桁の ZIP コードと +4 番号に分割し、それぞれの番号を出力行の各フィールドに書き込みます。if (data['PostalCode'].length() > 5) { String postalCode = data['PostalCode']; int separatorPosition = postalCode.indexOf('-'); String zip = postalCode.substring(0, separatorPosition); String plusFour = postalCode.substring( separatorPosition + 1, postalCode.length(); data['Zip']=zip; data['PlusFour']=plusFour; }
条件付き処理を実行するには
if
またはswitch
文を使用します。これらは、条件付き処理で最も一般的に使用される構造です。詳細については、groovy-lang.org を参照してください。この例では、AddressCity フィールドを最初の住所行に設定し、都市が Austin の場合は都市名も設定します。
city = data['City']; address1 = data['AddressLine1'] if(city.equals('Austin')) data['AddressCity']=address1 +',' + city;
ループ処理を実行するには
for
ループを使用します。これは、唯一必要なループ構造です。ループ処理または構文の詳細については、groovy-lang.org を参照してください。データを拡張するには
定数を定義し、連結文字
+
を使用します。例えば、このスクリプトは、"Incorporated" という単語を FirmName フィールドに追加します。firmname = data['FirmName']; constant = 'Incorporated'; if(firmname.length() > 0) data['FirmName']=firmname + ' ' + constant;
実行時に指定されたオプションにアクセスするには
データフローで実行時オプションが有効になっている場合、次の構文を使用して、実行時にデータフローに引き渡される設定にアクセスできます。
options.get("optionName")
例えば、casing という名前のオプションにアクセスするには、Custom Transform スクリプトに次の式を含めます。
options.get("casing")
- スクリプトの入力が完了したら、ウィンドウの "X" ボタンをクリックしてエディターを閉じます。
- [入力フィールド] フィールドで、トランスフォームを適用するフィールドを選択します。
- [出力フィールド] フィールドで、トランスフォームからの出力を書き込むフィールドを指定します。必要に応じて、新しいフィールドを定義できます。その場合は、[出力フィールド] フィールドの右にある [追加] ボタンをクリックします。
- 作業が完了したら、ウィンドウ下部の [追加] ボタンをクリックします。
- [OK] をクリックします。