如何使用pentaho中的csv输入固定列对列进行重新排序
How to get the reorder the column with csv input fixed column in pentaho
场景:
我已经创建了将数据从 csv 文件加载到 table 的转换,并且我在 csv 文件中有以下列:
- Customer_Id
- Company_Id
- Employee_Name
但用户可以将列排序(随机顺序)作为
- Employee_Name
- Company_Id
- Customer_Id
所以,如果我尝试加载具有随机列排序的文件,kettle 是否会根据列名称加载正确的列值...?
您可以尝试这样的操作作为您的 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!
执行此操作的方法是使用元数据注入。查看示例,但基本上您需要一个模板来读取文件并将其写回。然后您使用另一个 parent 转换来确定标题,配置该模板然后执行它。
PDI 示例文件夹中有示例,还可以查看 github 上 matt casters 蓝图项目中的 "figuring out file format" 示例。
使用 ETL Metadata Injection
您可以使用这样的转换来规范化数据,或将其存储到您的数据库中:
然后您只需将正确的数据发送到该转换即可。您可以从 CSV 中读取 header 行,并使用 Row Normaliser
转换为 ETL Metadata Injection
.
使用的格式
我在这里包含了一个简单的例子:csv_inject on Dropbox,如果你制作这样的东西并且 运行 它来自 运行 每个 csv 文件它应该工作。
假设拒绝输入文件不是一个选项,您基本上有 4 个解决方案。
- 在外部编辑器中重新排序字段(如果包含日期,请不要使用 excel)
- 在转换中使用代码检测列 headers 并对文件重新排序。
- 按照 bolav 的建议使用元数据注入
- 创建一个工作。这需要:
一个。将文件加载到临时数据库中。
b.使用 sql 语句检索字段(使用带有 ORDER By 子句的 SELECT)
C。以正确的顺序输出文件
场景:
我已经创建了将数据从 csv 文件加载到 table 的转换,并且我在 csv 文件中有以下列:
- Customer_Id
- Company_Id
- Employee_Name
但用户可以将列排序(随机顺序)作为
- Employee_Name
- Company_Id
- Customer_Id
所以,如果我尝试加载具有随机列排序的文件,kettle 是否会根据列名称加载正确的列值...?
您可以尝试这样的操作作为您的 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!
执行此操作的方法是使用元数据注入。查看示例,但基本上您需要一个模板来读取文件并将其写回。然后您使用另一个 parent 转换来确定标题,配置该模板然后执行它。
PDI 示例文件夹中有示例,还可以查看 github 上 matt casters 蓝图项目中的 "figuring out file format" 示例。
使用 ETL Metadata Injection
您可以使用这样的转换来规范化数据,或将其存储到您的数据库中:
然后您只需将正确的数据发送到该转换即可。您可以从 CSV 中读取 header 行,并使用 Row Normaliser
转换为 ETL Metadata Injection
.
我在这里包含了一个简单的例子:csv_inject on Dropbox,如果你制作这样的东西并且 运行 它来自 运行 每个 csv 文件它应该工作。
假设拒绝输入文件不是一个选项,您基本上有 4 个解决方案。
- 在外部编辑器中重新排序字段(如果包含日期,请不要使用 excel)
- 在转换中使用代码检测列 headers 并对文件重新排序。
- 按照 bolav 的建议使用元数据注入
- 创建一个工作。这需要:
一个。将文件加载到临时数据库中。 b.使用 sql 语句检索字段(使用带有 ORDER By 子句的 SELECT) C。以正确的顺序输出文件