我想将CSV文件中的许多信息导入Elastic Search。 我的问题是,我不知道如何使用等效的子字符串来选择CSV列中的信息。
在我的情况下,我有一个字段日期(YYYYMMDD),我想要(YYYY-MM-DD)。
我使用filter,mutate,gsub之类的:
filter
{
mutate
{
gsub => ["date", "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]", "[0123456789][0123456789][0123456789][0123456789]-[0123456789][0123456789]-[0123456789][0123456789]"]
}
}
但我的结果是假的。 我可以识别我的字符串,但我不知道如何提取部分内容。
我的目标是:
gsub => ["date", "[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]","%{date}(0..3}-%{date}(4..5)-%{date}"(6..7)]
%{date}(0..3}:从csv列的第一个到第4个字符中选择日期
答案 0 :(得分:2)
您可以使用ruby
插件进行转换。如你所说,你将有一个date
字段。因此,我们可以直接在ruby
filter {
ruby {
code => "
date = Time.strptime(event['date'],'%Y%m%d')
event['date_new'] = date.strftime('%Y-%m-%d')
"
}
}
date_new
字段是您想要的格式。
答案 1 :(得分:1)
首先,您可以使用正则表达式范围来匹配序列,因此您可以执行[0-9]而不是[0123456789]。如果你知道会有4个号码,你可以[0-9] {4}。
其次,您希望“捕获”输入字符串的一部分并在输出中重新排序。为此,您需要捕获组:
([0-9]{4})([0-9]{2})([0-9]{2})
parens定义组。然后你可以参考gsub右侧的那些:
\1-\2-\3
\ 1是第一个捕获组等。
您可能还会考虑在执行grok {}时获取这三个字段,然后再将它们放在一起(可能使用add_field)。