【问题标题】:Loading .log file in R在 R 中加载 .log 文件
【发布时间】:2018-08-19 19:04:56
【问题描述】:

我有很大的 data.log 文件,下面有几行示例。我想将其转换为 EDA 的数据框。

{"date":"2018-03-29T12:49:25.308+0000","level":"INFO","message":"User 
authenticated","action":"user_authenticated","username":"test@test.com"}
{"date":"2018-03-29T12:49:35.518+0000","level":"INFO","message":"User changed 
password with recovery (Web)","action":"recovery_password_changed","requestSource":"WEB","username":"test123@test.com"}

我尝试从 jsonlite 库加载 json,但出现错误,解析错误:尾随垃圾。我检查了wd,一切正常。

mydata <- fromJSON("data.log")

parse_con(txt, bigint_as_char) 中的错误:解析错误:尾随 垃圾 "用户名":"test@test.com"} {"日期":"2018-03-29T12:49:35.51 (就在这里)------^

【问题讨论】:

    标签: r json jsonlite


    【解决方案1】:

    这里没有有效的 json。你需要将它预处理成这样的东西

    x <- '[{"date":"2018-03-29T12:49:25.308+0000","level":"INFO","message":"User authenticated","action":"user_authenticated","username":"test@test.com"},
    {"date":"2018-03-29T12:49:35.518+0000","level":"INFO","message":"User changed password with recovery (Web)","action":"recovery_password_changed","requestSource":"WEB","username":"test123@test.com"}
    ]'
    
    library(jsonlite)
    
    fromJSON(x)
    
                              date level                                   message
    1 2018-03-29T12:49:25.308+0000  INFO                        User authenticated
    2 2018-03-29T12:49:35.518+0000  INFO User changed password with recovery (Web)
                         action         username requestSource
    1        user_authenticated    test@test.com          <NA>
    2 recovery_password_changed test123@test.com           WEB
    

    或每行一个条目。

    > y <- '{"date":"2018-03-29T12:49:25.308+0000","level":"INFO","message":"User authenticated","action":"user_authenticated","username":"test@test.com"}'
    > fromJSON(y)
    $`date`
    [1] "2018-03-29T12:49:25.308+0000"
    
    $level
    [1] "INFO"
    
    $message
    [1] "User authenticated"
    
    $action
    [1] "user_authenticated"
    
    $username
    [1] "test@test.com"
    

    如果日志文件的每一行都包含 {...} 条目,则可以遍历每一行并将其转换为 json。 mylog.txt 包含两个条目。

    xy <- readLines("mylog.txt")
    sapply(xy, fromJSON, USE.NAMES = FALSE)
    
    [[1]]
    [[1]]$`date`
    [1] "2018-03-29T12:49:25.308+0000"
    
    [[1]]$level
    [1] "INFO"
    
    [[1]]$message
    [1] "User authenticated"
    
    [[1]]$action
    [1] "user_authenticated"
    
    [[1]]$username
    [1] "test@test.com"
    
    
    [[2]]
    [[2]]$`date`
    [1] "2018-03-29T12:49:35.518+0000"
    
    [[2]]$level
    [1] "INFO"
    
    [[2]]$message
    [1] "User changed password with recovery (Web)"
    
    [[2]]$action
    [1] "recovery_password_changed"
    
    [[2]]$requestSource
    [1] "WEB"
    
    [[2]]$username
    [1] "test123@test.com"
    

    或者您可以直接将其强制转换为 data.frame。

    sapply(xy, FUN = function(x) {
      out <- fromJSON(x)
      as.data.frame(out)
    }, USE.NAMES = FALSE)
    
    [[1]]
                              date level            message             action
    1 2018-03-29T12:49:25.308+0000  INFO User authenticated user_authenticated
           username
    1 test@test.com
    
    [[2]]
                              date level                                   message
    1 2018-03-29T12:49:35.518+0000  INFO User changed password with recovery (Web)
                         action requestSource         username
    1 recovery_password_changed           WEB test123@test.com
    

    【讨论】:

    • 如果我在 .log 文件中有超过 900,000 行且每行有 { },那么 jsonlite 是最简单的方法还是有替代方法?
    • 好的。我尝试使用 sapply,它创建了一个列表并尝试使用 myDf
    • 请编辑您的原始问题或将其作为单独的问题发布。我需要查看您正在使用的完整代码,包括。数据。
    【解决方案2】:

    您可以使用ndjson::stream_in()jsonlite::stream_in()。您拥有的是换行符分隔的 JSON。这几天非常普遍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-03
      • 2017-06-30
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      相关资源
      最近更新 更多