情景:
我已创建转换以将数据从csv文件加载到表中,并且我在csv文件中有以下列:
但是用户可以将带有列排序(随机顺序)的输入文件作为
所以,如果我尝试加载具有随机列排序的文件,将根据列名称加载正确的列值...?
答案 0 :(得分:3)
使用ETL Metadata Injection
您可以使用这样的转换来规范化数据,或将其存储到数据库中:
然后您只需要将正确的数据发送到该转换。您可以从CSV中读取标题行,并使用Row Normaliser
转换为ETL Metadata Injection
使用的格式。
我在这里添加了一个快速示例:csv_inject on Dropbox,如果你做了类似这样的事情,并按照每个csv文件运行它的东西运行它应该有效。
答案 1 :(得分:2)
噢,那是一些讨厌的javascript!
执行此操作的方法是使用元数据注入。查看示例,但基本上您需要一个读取文件的模板,然后将其写回。然后使用另一个父转换来计算标题,配置该模板然后执行它。
PDI样本文件夹中有样本,并且还要查看"计算文件格式"在github的matt casters blueprints项目中的例子。
答案 2 :(得分: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
答案 3 :(得分:0)
假设拒绝输入文件不是一个选项,你基本上有4个解决方案。
一个。将文件加载到临时数据库中。 湾使用sql语句检索字段(使用带有ORDER By子句的SELECT) C。以正确的顺序输出文件