我正在使用TalenD工作室将大约80个日志文件合并为1个巨型文件。这些文件只是标准的txt文件。我目前有一个工作设置将所有文件合并在一起(它们使用相同的标题和格式),但我的问题如下。
第一列包含用户登录ID,如果用户正在运行服务器,则会在日志中捕获,如果它们在本地运行则不是。我需要做的是当登录ID为Null / Blank时,从位于第4列的文件路径中查找登录。
路径设置为eitehr C:\ Documents and Settings(此处为登录ID)....或C:\ Users(此处为登录ID)....或C:\ DOCUME~1(此处为登录ID) )...所以它总是在第二组反斜杠之间。但是,我是TalenD的新手,并且我不确定在表达式中放入什么来提取这些数据并将其放入登录ID字段。
如果有人有办法做到这一点,或者可以引导我朝着正确的方向前进,那将非常有帮助!
答案 0 :(得分:2)
如果登录ID字段为空或空白,您可以使用tExtractRegexFields
组件从文件路径中提取登录ID,然后有条件地将其映射到tMap
中的登录ID列。
这样做的典型工作可能如下:
这有一个数据输入(在这种情况下是一个tFixedFlowInput
组件来硬编码作业的值),一个tExtractRegexFields
组件从文件路径列中提取登录ID,然后是{ {1}}组件有条件地映射数据。
上面tMap
组件中的值包含您在日志中看到的实例的组合,并且还显示与文件路径中的登录ID不同的登录ID,因此您可以看到您并不总是覆盖您的登录ID,只在必要时使用文件路径中的那个。
在此之后,我们需要配置tFixedFlowInput
以查看filepath列并尝试查找捕获组。我使用了正则表达式tExtractRegexField
,它将捕获任何“类似字”的字符,直到发生反斜杠。您可能需要调整此项以便为您的用户获得正确的结果。 "^C:\\\\(?:Users|DOCUME~1|Documents and Settings)\\\\(\\w+)\\\\"
组件的架构还要求您为每个捕获组添加额外的列(这也是我将交替组作为被动组的原因),它将按顺序填充这些列。因此,如果您的正则表达式中有3个捕获组,但只有2个额外字段,那么将只使用前2个捕获组。
最后,我们在tExtractRegexField
组件中使用一些简单的逻辑来在必要时使用提取的登录ID:
这里我们定义一个布尔变量来测试登录字段是空还是空白,如果是,我们使用先前定义的regexLogin值,否则我们使用原始登录值。
这是结果:
注意我们如何成功地从3个空或用户ID条目中获取用户ID,以及当登录ID与我们从文件路径中提取的用户之间发生冲突时,我们如何推迟原始登录ID。
答案 1 :(得分:0)
你必须在tmap变量或表达式中编写java代码 示例如下(应根据您的要求进行修改)
String strtemp = "C:\\document settings\\userid";
System.out.println(strtemp.substring(strtemp.lastIndexOf("\\")+1));