这是我在R中加载的日志模板的结构。如何清理它以创建数据框?
{"ask":{"Id":001,"TS":10012001,"Response":"12"}}
{"ask":{"Id":002,"TS":11012001,"Response":"10"}}
预期输出应为单个列,其值在数据框中以供进一步分析。
答案 0 :(得分:1)
library(V8)
library(jqr)
library(tidyverse)
txt <- '{"ask":{"Id":001,"TS":10012001,"Response":"12"}}
{"ask":{"Id":002,"TS":11012001,"Response":"10"}}'
lines <- readLines(textConnection(txt))
ctx <- v8()
map_df(lines, function(x) {
ctx$eval(sprintf("var dat=%s", JS(x)))
ctx$get("dat") %>%
unlist() %>%
as.list()
})
## # A tibble: 2 × 3
## ask.Id ask.TS ask.Response
## <chr> <chr> <chr>
## 1 1 10012001 12
## 2 2 11012001 10
map(lines, jq, ".") %>%
map(jsonlite::fromJSON) %>%
map(unlist) %>%
map_df(as.list)
## # A tibble: 2 × 3
## ask.Id ask.TS ask.Response
## <chr> <chr> <chr>
## 1 1 10012001 12
## 2 2 11012001 10
map(lines, jq, ".") %>%
map(flags, pretty=FALSE) %>%
map_df(~ndjson::flatten(.$data))
## Source: local data table [2 x 3]
##
## # tbl_dt [2 × 3]
## ask.Id ask.Response ask.TS
## <dbl> <chr> <dbl>
## 1 1 12 10012001
## 2 2 10 11012001
如有必要, mutate()
+ sprintf()
领先的0
答案 1 :(得分:0)
这是一个快速解决方案:
1.将整个文件读为字符数组:
sfile <- readLines(file)
2.使用gsub
清除sfile
,假设原始示例中的确切结构:
sfile <- gsub("{ \"ask\": { \"Id\":| \"TS\":| \"Response\":\"|\" }}", "", sfile, perl = TRUE)
3.现在将其作为commma分隔值读取(read.csv
接受字符串而不是文件作为输入)
df <- read.csv(file=sfile)
4.命名列
names(df) <- c("Id", "TS", "Response")
这是一个使用数组而不是输入文件的测试:
s <- c( '{ "ask": { "Id":001, "TS":10012001, "Response":"12" }}',
'{ "ask": { "Id":002, "TS":11012001, "Response":"10" }}'
)
现在你得到一个逗号分隔的值字符数组
> gsub("{ \"ask\": { \"Id\":| \"TS\":| \"Response\":\"|\" }}", "", s, perl = TRUE)
[1] "001,10012001,12" "002,11012001,10"
答案 2 :(得分:0)
由于除了应该用引号括起的前导零编号字符串之外,这些行几乎是有效的JSON,因此请考虑清除有效的JSON并导入为jsonlite的一行数据帧。然后行绑定列表中的所有单个df元素。下面迭代地读取日志中的行以转换每一行:
library(jsonlite)
loglines <- readLines("/path/to/log.txt")
dfList <- lapply(loglines, function(line){
# JSON CONVERT WITH QUOTE AND BRACKET WRAPPING
jsonline <- paste0("[", gsub(',"TS', '","TS', gsub('Id":', 'Id":"', line)), "]")
fromJSON(jsonline)[[1]]
})
df <- do.call(rbind, dfList)
rownames(df) <- NULL