シナリオ:
csv ファイルからテーブルにデータをロードするための変換を作成しました。csv ファイルには次の列があります。
- 顧客ID
- Company_Id
- 従業員名
ただし、ユーザーは入力ファイルに列の順序 (ランダムな順序) を次のように指定できます。
- 従業員名
- Company_Id
- 顧客ID
したがって、列の順序がランダムなファイルをロードしようとすると、ケトルは列名に従って正しい列値をロードしますか...?
次のような変換を使用ETL Metadata Injection
して、データを正規化するか、データベースに保存できます。
次に、正しいデータをその変換に送信するだけです。CSV からヘッダー行を読み取り、 を使用Row Normaliser
して で使用される形式に変換できますETL Metadata Injection
。
ここに簡単な例を含めました: csv_inject on Dropbox、このようなものを作成し、csv ファイルごとに実行するものから実行すると、動作するはずです。
ああ、それは厄介な JavaScript です。
これを行う方法は、メタデータ インジェクションです。サンプルを見てください。基本的には、ファイルを読み取って書き戻すテンプレートが必要です。次に、別の親変換を使用して見出しを見つけ、そのテンプレートを構成してから実行します。
PDI サンプル フォルダーにサンプルがあり、github のマット キャスター ブループリント プロジェクトの「ファイル形式を理解する」の例も参照してください。
JavaScript として次のようなものを試すことができます。
//Script here
var seen;
trans_Status = CONTINUE_TRANSFORMATION;
var col_names = ['Customer_Id','Company_Id','Employee_Name'];
var col_pos;
if (!seen) {
// First line
trans_Status = SKIP_TRANSFORMATION;
seen = 1;
col_pos = [-1,-1,-1];
for (var i = 0; i < col_names.length; i++) {
for (var j = 0; j < row.length; j++) {
if (row[j] == col_names[i]) {
col_pos[i] = j;
break;
}
}
if (col_pos[i] === -1) {
writeToLog("e", "Cannot find " + col_names[i]);
trans_Status = ERROR_TRANSFORMATION;
break;
}
}
}
var Customer_Id = row[col_pos[0]];
var Company_Id = row[col_pos[1]];
var Employee_Name = row[col_pos[2]];
これが私が試した.ktrです:csv_reorder.ktr
(編集、ここにテスト csv ファイルがあります) 1.csv:
Customer_Id,Company_Id,Employee_Name
cust1,comp1,emp1
2.csv:
Employee_Name,Company_Id,Customer_Id
emp2,comp2,cust2