Java / Talend根据条件分解字符串并清除数据

时间:2019-05-13 18:07:50

标签: java talend

我有一个原始数据字符串列表。每个字符串都可以包含Talend 7中的公司名称+压力地址+城市+省。字符串之间用竖线分隔。

总行数为200,000。

我想以一种有效的方式提取并分离公司名称。问题是公司名称的管道不规则存在。

以下是每个字符串可以具有的一些示例:

  1. “ Mackenzie Health | Trench St.10 |里士满希尔(LichCill ON)L4C 4Z3”
  2. “”
  3. “健康与保健中心|多伦多大学|大学街214号111室|多伦多ON M5T 2Z9”
  4. “ Walmer Road 400 | Suite 125 | Toronto ON M5P 2X7”
  5. “病残儿童医院|重症医学科| 2楼中庭,2830室| 555大学大道|多伦多ON M5G 1X8”

我正在考虑使用tJava或tJavaRow,并编写一些Java代码,使用contains方法,我可以检查字符串是否包含以下单词之一:Avenue,Ave,Road,Rd,Street和St。这些话之前还有空间。

这是我的问题:找到哪个记录具有街道地址后,我需要知道街道地址之前是否存在任何管道,如果可以,有多少个管道?所以我可以将它们合并为公司名称。

示例:

“ Mackenzie Health | Trench St.10 |里士满希尔L4C 4Z3”在街道地址10 Trench St.之前只有一个管道,因此公司名称为 Mackenzie Health

“健康与保健中心|多伦多大学|学院街214号111室|多伦多ON M5T 2Z9”在街道地址前有两条管道,因此公司名称为: 多伦多大学健康与保健中心

“ Walmer Road 400 | Suite 125 | Toronto ON M5P 2X7”之前没有管道,所以没有任何名称

“患病儿童医院|重症医学科| 2楼中庭,2830室|大学大道555 |多伦多ON M5G 1X8”前有三根管,但在子串中有三根管文字室。因此,公司的名称为重症医学科儿童病医院。

也欣赏任何想法和/或新的解决方案

1 个答案:

答案 0 :(得分:2)

您可以使用捕获组(可以在tMap组件中或其他位置调用)基于模式匹配在Talend例程中创建Java方法。

https://www.tutorialspoint.com/javaregex/javaregex_capturing_groups.htm

在您的情况下,您可以使用以下RegEx示例(似乎可以解决给出的5个示例):

此正则表达式按最后一次出现(从右开始)分组:

^(.*\|)*((?i).*(room|st.|street|road|avenue).*\|(?-i).*)$

我已经通过https://regex101.com/测试了RegEx。组1是您的公司名称,组2是您的地址。您可以进一步删除不需要的管道。

此正则表达式按第一次出现(从左开始)进行分组:

^((((?!room|street|st.|road|avenue).)*\|)|)*((?i).*(room|street|st.|road|avenue).*\|(?-i).*)$.

第2组和第4组现在具有数据。

注意:所有积分都来自Mo2,我只是将他的回答从评论复制到此处,希望对其他人有用。

已修复::RegEx中的星号字符问题,与stackoverflow标签混淆。

希望对您有用。如果需要更多帮助,请说我。