Talend:tMAP LookUp - 行

时间:2016-08-26 15:56:56

标签: vlookup talend

您好我正在使用tMap组件和Vloopup功能遇到问题。 基本上我输入了一个excel文件,我已经复制了输入,一个用于主行,另一个用于查找: enter image description here

Excel列(FileInputExcel_1 + FileInputExcel_3):

enter image description here

我的目标是: FileInputExcel_1逐行迭代, 对于每个FileInputExcel_1行,我需要在COL2中查找FileInputExcel_1 COL3 返回第一个匹配FileInputExcel_3 COL1值 FIRST MATCH FileInputExcel_3 ROW> =实际ROW迭代FileInputExcel_1

ie:ROW 1结果应为61416:

enter image description here

ie:ROW 5结果应为3225:

enter image description here

我已经尝试过使用tMap,但我不明白如何遵守ROW规则:尽管有光标,但我总是无法获得第一个匹配(仅返回BN_LINE变量) at和subjob,所以不能使用它)。 任何想法/解决方法? 非常感谢

3 个答案:

答案 0 :(得分:2)

在tMap中你必须加入(内连接,你想要获得匹配的记录)输入和查找如下。

row3.COL3 = row4.COL2

然后将结果映射到tMap的右侧

row4.COL1 - >结果。

答案 1 :(得分:2)

我有另一个建议我已经改变了一点,100%工作并且只使用没有JAVA代码段的Talend组件。 enter image description here

1,在tFileExcelInput中添加一个代表行号的列(例如等级);结果缓冲到tHashOutput_1

enter image description here

2,使用tMap将tHashOutput_1与自身连接,对等级进行过滤,确保选择所有匹配 enter image description here

3,使用tUniqRow消除重复

答案 2 :(得分:1)

如果您了解Java,可以先在Java List(ArrayList)中加载Excel文件值(col1和col2)。
然后迭代Excel文件,递增计数器。对于每一行,找到Java列表中的第一个匹配,但是从索引开始等于你的计数器。

(抱歉我的英语不好)

编辑:使用TOS 6.2.1的示例 2个上下文变量:
- myValues(Object)
- index(整数)默认为0

a busy cat http://img4.hostingpics.net/pics/478043schema.png

首先,我们在列表中加载您的excel数据。我们迭代你的文件,为tJavaRow组件中的每一行"加载数据":

if(context.myValues == null){
  context.myValues = new java.util.ArrayList<>();
}
// Create a pair contening col1 and col3
javafx.util.Pair<String, String> pair = new javafx.util.Pair<>(input_row.col1, input_row.col3);
// Add the pair in the list
((java.util.ArrayList<javafx.util.Pair<String, String>>)context.myValues).add(pair);

然后我们再次迭代excel1(就像你的工作一样),但在tjavaRow&#34; index&#34;中,我们搜索自当前索引以来的第一个匹配:

java.util.ArrayList<javafx.util.Pair<String, String>> myList = ((java.util.ArrayList<javafx.util.Pair<String, String>>) context.myValues);
// For each row in the list startin from the current index
for(int i = context.index; i < myList.size(); i++){
  javafx.util.Pair<String, String> currentPair = myList.get(i);
  // if col3 == col2
  if(currentPair.getValue().equals(input_row.col2)){
    output_row.expectedCol1 = currentPair.getKey();
    break;
  }
}
// move to next index
context.index++;

希望它会帮助你