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

Java/ Talend Breaking down a String based on a condition and cleaning data

我有一个原始数据字符串列表。 Talend 7中每个字符串可能包含公司名称+压力地址+城市+省份。它们在字符串中由竖线分隔。

总行数为200,000。

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

以下是每个字符串可以包含的一些示例:

  1. "Mackenzie Health|10 Trench St.|Richmond Hill ON L4C 4Z3"
  2. ""
  3. "Health and Wellness Center|University of Toronto|214 College Street, Room 111|Toronto ON M5T 2Z9"
  4. "400 Walmer Road|125 号套房|多伦多 ON M5P 2X7"
  5. "The Hospital for Sick Children|Dept. of Critical Care Medicine|2nd Floor Atrium, Room 2830|555 University Ave|Toronto ON M5G 1X8"

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

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

示例:

"Mackenzie Health|10 Trench St.|Richmond Hill ON L4C 4Z3" 街道地址 10 Trench St. 之前只有一根管道,所以公司名称是 麦肯齐健康

"Health and Wellness Center|University of Toronto|214 College Street, Room 111|Toronto ON M5T 2Z9"街道地址前有两个竖线,所以公司名称是: 多伦多大学健康中心

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

"The Hospital for Sick Children|Dept. of Critical Care Medicine|2nd Floor Atrium, Room 2830|555 University Ave|Toronto ON M5G 1X8" 前面有三个竖线,但是在子串里,在它前面,有room这个词。所以公司名称是病童医院重症医学科

欣赏任何想法and/or 还有新的解决方案

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

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 组现在有数据。

注意:所有学分都是给Mo2s的,我只是把他的回答从评论里复制到这里,希望对其他人有用。

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

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