使用Logstash Ruby过滤器来解析csv文件

时间:2015-07-08 10:20:54

标签: ruby csv elasticsearch logstash

我有一个弹性搜索索引,我用它来索引一组文档。

这些文档最初是csv格式,我正在使用logstash解析它们。

我的问题是我有以下几点。

  

FIELD1,FIELD2,字段3,XYZ,ABC

field3类似于123456789,我想使用ruby代码过滤器将其解析为4.56(789)。

我的尝试:

我尝试使用stdin和stdout使用以下logstash.conf。

input {
        stdin {
        }
}

filter {
        ruby {
                code => "
                  b = event["message"]
                  string2=""
                  for counter in (3..(num.size-1))
                         if counter == 4
                                string2+= '_'+ num[counter]
                         elsif counter ==  6
                                string2+= '('+num[counter]
                         elsif counter == 8
                                string2+= num[counter]  +')'
                         else
                                string2+= num[counter]
                         end

                  end

                 event["randomcheck"] = string2

                "
        }
}


output {
        stdout {
                codec=>rubydebug
        }
}

我使用此语法时出现语法错误。

我的最终目标是将此与我的csv文件一起使用,但首先我尝试使用stdin和stdout。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

您获得语法错误的原因很可能是因为您在双引号字符串中有未转义的双引号。将字符串单引号或保持双引号但在内部使用单引号。我也不了解该代码应该如何工作。

但是,除此之外,为什么首先使用红宝石过滤器?您可以使用csv过滤器进行CSV解析,并使用几个标准过滤器将123456789转换为4.56(789)。

filter {
  # Parse the CSV fields and then delete the 'message' field.
  csv {
    remove_field => ["message"]
  }
  # Given an input such as 123456789, extract 4, 56, and 789 into
  # their own fields.
  grok {
    match => [
      "column3",
      "\d{3}(?<intpart>\d)(?<fractionpart>\d{2})(?<parenpart>\d{3})"
    ]
  }
  # Put the extracted fields together into a single field again,
  # then delete the temporary fields.
  mutate {
    replace => ["column3", "%{intpart}.%{fractionpart}(%{parenpart})"]
    remove_field => ["intpart", "factionpart", "parenpart"]
  }
}

上面的示例中的临时字段名称非常糟糕,因为我不知道它们代表什么。此外,根据输入的外观,您可能需要调整grok表达式。现在它假设九位数输入。