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

Posted

技术标签:

【中文标题】如何在pentaho中使用csv输入固定列重新排序列【英文标题】:How to get the reorder the column with csv input fixed column in pentaho 【发布时间】:2016-01-21 08:18:10 【问题描述】:

场景:

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

    Customer_Id Company_Id 员工姓名

但是用户可以给输入文件的列顺序(随机顺序)作为

    员工姓名 Company_Id Customer_Id

所以,如果我尝试加载具有随机列顺序的文件,水壶是否会根据列名加载正确的列值...?

【问题讨论】:

如果列标题始终在文件中,您可以使用 UDJCjavascript 来完成,但最好的解决方案可能是回击用户并让他们为您提供适当的格式化文件。 嗨@Brian.D.Myers你能给我一些带有UDJC或JavaScript的ktr文件的示例示例以继续我的问题...高度赞赏 【参考方案1】:

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

然后您只需将正确的数据发送到该转换。您可以从 CSV 中读取标题行,并使用 Row Normaliser 转换为 ETL Metadata Injection 使用的格式。

我在这里提供了一个简单的示例:csv_inject on Dropbox,如果您制作这样的东西并从每个 csv 文件运行它的东西运行它,它应该可以工作。

【讨论】:

Dropbox 链接不再可用,您能修复它吗?【参考方案2】:

哦,那是一些讨厌的 javascript!

执行此操作的方法是使用元数据注入。查看示例,但基本上您需要一个模板来读取文件并将其写回。然后,您使用另一个父转换来确定标题,配置该模板,然后执行它。

PDI 示例文件夹中有示例,也可以看看 github 上 matt casters blueprints 项目中的“计算文件格式”示例。

【讨论】:

嗯。我用ETL metadata injection 步骤尝试过,但之前从未使用过它,我没有让它工作。我想我应该再试一次。过去,我使用 Python 脚本对此类事情进行了预处理。 这不是一个很有建设性的答案。首先,您是在说解决方案不好,而没有说它有什么不好。然后你说存在另一种解决方案而没有说明如何解决它。除了可能存在另一个答案之外,我没有从您的答案中学到任何东西。 @codek ...你能举例说明一下吗...提前谢谢【参考方案3】:

你可以尝试这样的东西作为你的 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

【讨论】:

你能根据我的例子给我样品吗..我没有得到你的ktr..使用java代码..有没有其他方法可以代替java代码 这是基于您的示例。 “没有得到你的 ktr”是什么意思? 我试过你的 csv_reorder.ktr..但我没有得到预期的输出 你得到什么输出,你的输入是什么? 它是“修改后的 Java 脚本值” - 步骤【参考方案4】:

假设拒绝输入文件不是一个选项,您基本上有 4 个解决方案。

    在外部编辑器中重新排序字段(如果 Excel 包含日期,请勿使用) 使用转换中的代码来检测列标题并对文件重新排序。 使用 bolav 建议的元数据注入 创建作业。这需要:

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

【讨论】:

以上是关于如何在pentaho中使用csv输入固定列重新排序列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pentaho Spoon 中拆分列的值?

您可以在 Pentaho 数据集成 (PDI) 中动态设置固定文件输入列定义吗?

如何在CDE Pentaho中执行动态标题列?

pentaho 除法 2 列

在 Pentaho 中对 200-3 亿条记录进行排序的最佳方法?

如何用 Pentaho Kettle 填充我的事实表