场景:如何获得重新排序以CSV输入固定列的列在Pentaho的
我已经创建的转换将数据从csv文件加载到表,我在csv文件下列:
- CUSTOMER_ID
- COMPANY_ID
- Employee_Name
但用户可能会与输入文件列顺序(随机顺序)
- Employee_Name
- COMPANY_ID
- CUSTOMER_ID
所以,如果我尝试加载具有随机列顺序文件,将水壶负载正确的列值按列名...?
场景:如何获得重新排序以CSV输入固定列的列在Pentaho的
我已经创建的转换将数据从csv文件加载到表,我在csv文件下列:
但用户可能会与输入文件列顺序(随机顺序)
所以,如果我尝试加载具有随机列顺序文件,将水壶负载正确的列值按列名...?
使用ETL Metadata Injection
,你可以使用这样的改造,无论是标准化数据,或将其存储到数据库:
然后你只需要到正确的数据发送到改造。您可以从CSV读取标题行,并使用Row Normaliser
转换为ETL Metadata Injection
使用的格式。
我在这里包含了一个简单的例子:csv_inject on Dropbox,如果你做了这样的事情,并运行它从每个csv文件运行它应该工作。
你的链接不起作用 – Stevetech
你可以尝试这样的事情作为你的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
哦,这是一些讨厌的JavaScript!
做到这一点的方法是使用元数据注入。看样本,但基本上你需要一个读取文件的模板,并将其写回。然后使用另一个父变换来找出标题,配置该模板然后执行它。
有在PDI样本文件夹的样本,也看看了“搞清楚文件格式”例如,在亚光在github上脚轮蓝图项目。
假设拒绝输入文件不是你基本上有4个解决方案的选项。
a。将文件加载到临时数据库中。 b。使用sql语句检索字段(使用带有ORDER By子句的SELECT) c。按照正确的顺序输出文件
如果列标题总是在文件中,你可以用'UDJC'或JavaScript来完成,但最好的解决方案可能是推回用户并让他们给你格式正确的文件。 –
嗨@ Brian.D.Myers可以给我一些示例与ktr文件与UDJC或JavaScript继续我的问题...高度appericiated – yuvi