2016-01-21 44 views
6

场景:如何获得重新排序以CSV输入固定列的列在Pentaho的

我已经创建的转换将数据从csv文件加载到表,我在csv文件下列:

  1. CUSTOMER_ID
  2. COMPANY_ID
  3. Employee_Name

但用户可能会与输入文件列顺序(随机顺序)

  1. Employee_Name
  2. COMPANY_ID
  3. CUSTOMER_ID

所以,如果我尝试加载具有随机列顺序文件,将水壶负载正确的列值按列名...?

+0

如果列标题总是在文件中,你可以用'UDJC'或JavaScript来完成,但最好的解决方案可能是推回用户并让他们给你格式正确的文件。 –

+0

嗨@ Brian.D.Myers可以给我一些示例与ktr文件与UDJC或JavaScript继续我的问题...高度appericiated – yuvi

回答

3

使用ETL Metadata Injection,你可以使用这样的改造,无论是标准化数据,或将其存储到数据库:

Metadata transformation

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

我在这里包含了一个简单的例子:csv_inject on Dropbox,如果你做了这样的事情,并运行它从每个csv文件运行它应该工作。

+0

你的链接不起作用 – Stevetech

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 
+0

你可以给我的示例基于我的例子..我没有得到你的ktr ..使用java代码..有没有其他的方式来代替java代码 – yuvi

+0

这是基于你的例子。你是什​​么意思“没有得到你的ktr”? – bolav

+0

我已经尝试过您的csv_reorder.ktr ..但我没有得到预期的输出 – yuvi

2

哦,这是一些讨厌的JavaScript!

做到这一点的方法是使用元数据注入。看样本,但基本上你需要一个读取文件的模板,并将其写回。然后使用另一个父变换来找出标题,配置该模板然后执行它。

有在PDI样本文件夹的样本,也看看了“搞清楚文件格式”例如,在亚光在github上脚轮蓝图项目。

+0

呵呵。我尝试了'ETL元数据注入'步骤,但之前从未使用它,但我没有得到它的工作。猜猜我应该再试一次。在过去,我用Python脚本预处理了这样的东西。 –

+0

这不是一个非常有建设性的答案。首先你说的是一个解决方案是不好的,没有说什么是坏的。然后你说的是另一个解决方案存在而不告诉如何解决它。除了可能存在另一个答案之外,我对你的答案一无所知。 – bolav

+0

@codek ...你能举例和解释我吗...先行谢谢 – yuvi

0

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

  1. 重新排列在外部编辑器等领域的转型,以检测列标题,重新排列文件中(不使用Excel,如果它包含日期)
  2. 使用代码。
  3. 使用元数据注入由bolav建议
  4. 创建一个工作。这需要:

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