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.

我在这里包含了一个简单的示例:Dropbox 上的 csv_inject,如果您制作这样的东西并从每个 csv 文件运行它的东西运行它,它应该可以工作。

于 2016-01-26T21:38:13.503 回答
2

哦,那是一些讨厌的javascript!

做到这一点的方法是使用元数据注入。查看示例,但基本上您需要一个模板来读取文件并将其写回。然后,您使用另一个父转换来确定标题,配置该模板,然后执行它。

PDI 示例文件夹中有示例,还可以查看 github 上 matt casters blueprints 项目中的“计算文件格式”示例。

于 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 回答
0

假设拒绝输入文件不是一个选项,您基本上有 4 个解决方案。

  1. 在外部编辑器中重新排序字段(如果它包含日期,请不要使用 excel)
  2. 使用转换中的代码来检测列标题并重新排序文件。
  3. 使用 bolav 建议的元数据注入
  4. 创建工作。这需要:

一种。将文件加载到临时数据库中。湾。使用 sql 语句检索字段(使用带有 ORDER By 子句的 SELECT) c.以正确的顺序输出文件

于 2017-01-23T16:54:58.190 回答