【问题标题】:Grok custom pattern for space delimited file空格分隔文件的 Grok 自定义模式
【发布时间】:2020-06-23 15:19:13
【问题描述】:

我正在尝试将文件加载到 Athena 中的结构化表中。我正在使用 GROK 模式将其加载到表中,但无法找到正确的模式。文件格式如下:

L1127          ACTUALS   214171              ON      27649075                                            -00000000000000000409618.02                          601 MBS  DAILY VISION - CAN OS         

L1127          ACTUALS   412821              ON      27649075  002060                                    -00000000000000000002657.33                          521 MBS  DAILY VISION - CAN OS                                                                                                                              

我正在使用的 GROK 模式:

(?<BusinessUnit>.{5})%{SPACE}(?<Type>.{7})%{SPACE}(?<PSGLAccountNumber>.{6})%{SPACE}(?<Province>.{2})%{SPACE}(?<DepartmentId>.{8})%{SPACE}(?<ProductId>.{6})%{SPACE}(?<Amount>.{27})%{SPACE}(?<TransCode>.{3})%{SPACE}(?<Feed>.{35})

当 ProductId 没有值时,我遇到了麻烦。

任何帮助将不胜感激。

【问题讨论】:

    标签: amazon-athena grok


    【解决方案1】:

    (?&lt;ProductId&gt;.{6})%{SPACE} 表示您希望ProductId 字段正好是六个字符,后跟任意数量的空格。从您发布的数据来看,在我看来应该发生的是第一行 ProductId 最终会变成六个空格。

    如果问题是它变成了六个空格并且您希望它是一个空字符串,您可以例如使用(?&lt;ProductId&gt;\S*)%{SPACE}\S* 匹配零个或多个非空格字符)。

    如果这不能解决您的问题,也许您可​​以更详细地描述您遇到了什么问题,以及您希望发生什么?


    更新:您在评论中指出此解决方案的问题是ProductId 列变为“-00000”。原因是 %{SPACE} 模式 before (?ProductId… 占用了 DepartmentIdAccount 字段之间的所有空格。为了解决这个问题,您可以限制DepartmentIdProductId 字段之间可以出现的空格数。在您发布的示例数据中,有两个空格,并且由于字段是固定宽度的,我认为情况总是如此。使用…(?&lt;DepartmentId&gt;.{8})\s{2}(?&lt;ProductId&gt;\S*)%{SPACE}(?&lt;Amount&gt;.{27})… 之类的模式应该可以解决问题。

    【讨论】:

    • 我需要 ProductId 作为空字符串,如果它只有空格并且如果它有一个值,我需要这个值。通过使用上面的 GROK 模式,如果 ProductId 为空,则打印为 -00000,这是不正确的。
    • 我已经更新了答案,看看建议是否有效。
    • 如果 ProductId 为空,则无法按预期工作。
    【解决方案2】:

    我能够使用下面的模式使其工作

    %{WORD:BusinessUnit}%{SPACE}%{WORD:Type}%{SPACE}%{POSINT:PSGLAccountNumber}%{SPACE}%{WORD:Province}%{SPACE}%{POSINT:DepartmentId}%{SPACE}%{custompat:ProductId}%{SPACE}%{NUMBER:Amount}%{SPACE}%{NUMBER:TransCode}%{SPACE}(?<Feed>[A-Za-z0-9\-\s]{26})
    

    并使用自定义模式:

    custompat ([0-9]{6}|\s{6})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多