设想:
我创建了转换以将数据从 csv 文件加载到表中,并且在 csv 文件中有以下列:
- 客户ID
- Company_Id
- 员工姓名
但是用户可以给输入文件的列排序(随机顺序)为
- 员工姓名
- Company_Id
- 客户ID
所以,如果我尝试加载具有随机列顺序的文件,水壶会根据列名加载正确的列值......?
使用ETL Metadata Injection
您可以使用这样的转换来规范化数据或将其存储到数据库中:
然后,您只需将正确的数据发送到该转换。您可以从 CSV 读取标题行,并用于Row Normaliser
转换为ETL Metadata Injection
.
我在这里包含了一个简单的示例:Dropbox 上的 csv_inject,如果您制作这样的东西并从每个 csv 文件运行它的东西运行它,它应该可以工作。
哦,那是一些讨厌的javascript!
做到这一点的方法是使用元数据注入。查看示例,但基本上您需要一个模板来读取文件并将其写回。然后,您使用另一个父转换来确定标题,配置该模板,然后执行它。
PDI 示例文件夹中有示例,还可以查看 github 上 matt casters blueprints 项目中的“计算文件格式”示例。
你可以尝试这样的事情作为你的 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
假设拒绝输入文件不是一个选项,您基本上有 4 个解决方案。
一种。将文件加载到临时数据库中。湾。使用 sql 语句检索字段(使用带有 ORDER By 子句的 SELECT) c.以正确的顺序输出文件