6

シナリオ:

csv ファイルからテーブルにデータをロードするための変換を作成しました。csv ファイルには次の列があります。

  1. 顧客ID
  2. Company_Id
  3. 従業員名

ただし、ユーザーは入力ファイルに列の順序 (ランダムな順序) を次のように指定できます。

  1. 従業員名
  2. Company_Id
  3. 顧客ID

したがって、列の順序がランダムなファイルをロードしようとすると、ケトルは列名に従って正しい列値をロードしますか...?

4

4 に答える 4

3

次のような変換を使用ETL Metadata Injectionして、データを正規化するか、データベースに保存できます。

メタデータ変換

次に、正しいデータをその変換に送信するだけです。CSV からヘッダー行を読み取り、 を使用Row Normaliserして で使用される形式に変換できますETL Metadata Injection

ここに簡単な例を含めました: csv_inject on Dropbox、このようなものを作成し、csv ファイルごとに実行するものから実行すると、動作するはずです。

于 2016-01-26T21:38:13.503 に答える
2

ああ、それは厄介な JavaScript です。

これを行う方法は、メタデータ インジェクションです。サンプルを見てください。基本的には、ファイルを読み取って書き戻すテンプレートが必要です。次に、別の親変換を使用して見出しを見つけ、そのテンプレートを構成してから実行します。

PDI サンプル フォルダーにサンプルがあり、github のマット キャスター ブループリント プロジェクトの「ファイル形式を理解する」の例も参照してください。

于 2016-01-22T15:44:38.310 に答える
0

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
于 2016-01-22T09:21:25.307 に答える