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

时间:2016-01-21 08:18:10

标签: pentaho kettle pdi

情景:

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

  1. CUSTOMER_ID
  2. COMPANY_ID
  3. Employee_Name
  4. 但是用户可以将带有列排序(随机顺序)的输入文件作为

    1. Employee_Name
    2. COMPANY_ID
    3. CUSTOMER_ID
    4. 所以,如果我尝试加载具有随机列排序的文件,将根据列名称加载正确的列值...?

4 个答案:

答案 0 :(得分:3)

使用ETL Metadata Injection您可以使用这样的转换来规范化数据,或将其存储到数据库中:

Metadata transformation

然后您只需要将正确的数据发送到该转换。您可以从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个解决方案。

  1. 在外部编辑器中重新排序字段(如果包含日期,请不要使用excel)
  2. 使用转换中的代码检测列标题并重新排序文件。
  3. 使用bolav
  4. 提出的元数据注入
  5. 创造一份工作。这需要:
  6. 一个。将文件加载到临时数据库中。 湾使用sql语句检索字段(使用带有ORDER By子句的SELECT) C。以正确的顺序输出文件