如何使用pentaho中的csv输入固定列对列进行重新排序

How to get the reorder the column with csv input fixed column in pentaho

场景:

我已经创建了将数据从 csv 文件加载到 table 的转换,并且我在 csv 文件中有以下列:

  1. Customer_Id
  2. Company_Id
  3. Employee_Name

但用户可以将列排序(随机顺序)作为

  1. Employee_Name
  2. Company_Id
  3. 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 个解决方案。

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

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