我有一个原始数据字符串列表。每个字符串都可以包含Talend 7中的公司名称+压力地址+城市+省。字符串之间用竖线分隔。
总行数为200,000。
我想以一种有效的方式提取并分离公司名称。问题是公司名称的管道不规则存在。
以下是每个字符串可以具有的一些示例:
我正在考虑使用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”前有三根管,但在子串中有三根管文字室。因此,公司的名称为重症医学科儿童病医院。
也欣赏任何想法和/或新的解决方案
答案 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标签混淆。
希望对您有用。如果需要更多帮助,请说我。