我正在开发一个talend项目,将推文日志加载到hive表中。但是由于文本文件的非结构化格式,我必须首先将其处理为结构化文件,在这种情况下我将其转换为csv,使其以逗号分隔。
我正在尝试将突出显示的部分作为单个列。 由于文件输入中按空格分隔的配置, 它拆分了推文。有什么方法可以解决这个问题吗?
答案 0 :(得分:0)
您的文件很难解析,因为您的数据中也存在分隔符(空格)。如果可能的话,最好在源头修复它。但由于这并不总是可行的,所以我可以提出:
我们的想法是在文本中的每个日期前插入换行符(或数据中尚未存在的任何其他字符)(因为这是最独特的模式)。接下来使用tNormalize
中的换行符(或替换中使用的换行符)对其进行标准化,以便每行包含一个包含日期,用户名和推文的字符串。
我把快速和脏的正则表达式放在一起以匹配日期:
(\\w{3}\\s\\w{3}\\s\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\w{3}\\s\\d{4})
并使用回车后跟匹配的日期替换:\n$1
接下来,tExtractRegexFields
使用另一个正则表达式,以便在其自己的列中提取日期,用户名和推文。这是我使用的正则表达式:
(\\w{3}\\s\\w{3}\\s\\d{2}\\s\\d{2}:\\d{2}:\\d{2}\\s\\w{3}\\s\\d{4}\\s)\\(([^\\)]+)\\)\\s(.+)
有3个捕获组,一个用于日期,一个用于用户名,最后一个捕获所有文本后面的推文。
在我的例子中,我使用了这个文本:
"Fri Mar 15 23:58:55 CET 2013 (iMezouar) this is the 1st tweetFri Mar 15 23:58:55 CET 2013 (username2) this is the 2nd tweetFri Mar 15 23:58:55 CET 2013 (username3) this is the 3rd tweet"
我得到了:
.-----------------------------+---------+----------------------.
| tLogRow_2 |
|=----------------------------+---------+---------------------=|
|date |username |tweet |
|=----------------------------+---------+---------------------=|
|Fri Mar 15 23:58:55 CET 2013 |iMezouar |this is the 1st tweet |
|Fri Mar 15 23:58:55 CET 2013 |username2|this is the 2nd tweet |
|Fri Mar 15 23:58:55 CET 2013 |username3|this is the 3rd tweet"|
'-----------------------------+---------+----------------------'