【问题标题】:Why can I only read one .json file at a time?为什么我一次只能读取一个 .json 文件?
【发布时间】:2019-01-24 22:06:51
【问题描述】:

我有 500 多个 .json 文件,我正试图从中获取特定元素。我不明白为什么我不能一次阅读多个..

这行得通:

library (jsonlite)
files<-list.files(‘~/JSON’)
file1<-fromJSON(readLines(‘~/JSON/file1.json),flatten=TRUE)
result<-as.data.frame(source=file1$element$subdata$data)

但是,无论使用不同的 json 包(例如 RJSONIO),我都无法将其应用于files 的全部内容。我继续得到的错误是......

尝试对文件列表中的所有内容运行与函数相同的代码

for (i in files) { fromJSON(readLines(i),flatten = TRUE) as.data.frame(i)$element$subdata$data}

我的目标是遍历所有 500 多个并提取数据及其内容。具体来说,如果文件具有元素“subdata$data”,我想提取列表并将它们全部放入数据框中。

注意:文件被读取为 ASCII(Windows 操作系统)。这确实对单次提取产生负面影响,但对于循环我得到“无效字符字节”

2019 年 1 月 25 日更新

运行以下但返回错误...

files<-list.files('~/JSON')
out<-lapply(files,function (fn) {
o<-fromJSON(file(i),flatten=TRUE)
as.data.frame(i)$element$subdata$data
})

Error in file(i): object 'i' not found

还更新了函数,这次出现了 UTF* 错误...

    files<-list.files('~/JSON')
out<-lapply(files,function (i,fn) {
o<-fromJSON(file(i),flatten=TRUE)
as.data.frame(i)$element$subdata$data
})

Error in parse_con(txt,bigint_as_char):
 lexical error: invalid bytes in UTF8 string. (right here)------^

最新更新 认为我找到了解决疯狂“字节”问题的方法。当我在 .json 文件上运行 readLines 时,我可以应用 fromJSON),

例如

json<-readLines('~/JSON')
jsonread<-fromJSON(json)
jsondf<-as.data.frame(jsonread$element$subdata$data)
#returns a dataframe with the correct information

问题是,我无法将 readLines 应用于 JSON 文件夹 (PATH) 中的所有文件。如果我能得到帮助,我想我可以跑......

files<-list.files('~/JSON')
for (i in files){
a<-readLines(i)
o<-fromJSON(file(a),flatten=TRUE)
as.data.frame(i)$element$subdata}

需要的步骤

将 readLines 应用于 JSON 文件夹中的所有 500 个 .json 文件 将 fromJSON 应用于 step.1 中的文件 创建一个返回条目的 data.frame if 列表(fromJSON)包含 $element$subdata$data。

想法?

解决方案(解决方法?)

不幸的是,fromJSON 仍然会遇到 .json 文件的问题。我的猜测是我的 GET 方法(httr)无法等待/延迟并加载“漂亮的打印”,因此正在抓取原始的 .json,这反过来又给出了奇怪的字符,结果给出了无处不在的 '--- ---^'错误。尽管如此,我还是能够提出一个解决方案,请参见下文。我想将它发布给未来可能遇到 .json 文件无法与任何 R json 包很好地配合的问题的人。

#keeping the same 'files' variable as earlier
raw_data<-lapply(files,readLines)
dat<-do.call(rbind,raw_data)
dat2<-as.data.frame(dat,stringsasFactors=FALSE)
#check to see json contents were read-in
dat2[1,1]

library(tidyr)
dat3<-separate_rows(dat2,sep='')
x<-unlist(raw_data)
x<-gsub('[[:punct:]]', ' ',x)

#Identify elements wanted in original .json and apply regex
y<-regmatches(x,regexc('.*SubElement2 *(.*?) *Text.*',x))

【问题讨论】:

    标签: r for-loop jsonlite


    【解决方案1】:
    1. for 循环永远不会返回任何内容,因此您必须自己保存所有有价值的数据。
    2. 您调用 as.data.frame(i) 创建一个框架,其中只有一个元素,即文件名,可能不是您想要保留的。
    3. (次要)使用fromJSON(file(i),...)
    4. 由于您想将这些捕捉到一帧中,我建议您采用以下方式:

      out <- lapply(files, function(fn) {
        o <- fromJSON(file(fn), flatten = TRUE)
        as.data.frame(o)$element$subdata$data
      })
      allout <- do.call(rbind.data.frame, out)
      ### alternatives:
      allout <- dplyr::bind_rows(out)
      allout <- data.table::rbindlist(out)
      

    【讨论】:

    • 感谢您的回复。我会试试这个!顺便说一句,关于为什么 .json (fromJSON) 在 geoup 操作上给出错误但在调用个人时没有给出任何想法?
    • 我不知道你所说的“集体行动”是什么意思。
    • 抱歉,就像我尝试运行“fromJSON”并遍历文件列表时一样。由于无效的字符字节而返回错误 - 通常与不是 UTF-8 相关。
    • fromJSON(file(f)) 还是fromJSON(readLines(f))?我不知道这是否有区别。像这样的错误通常与单独或在某种形式的循环中(可能是一个新问题)无关。
    • 您的更新不起作用 - 但是,它帮助我找到了解决方案 :) !我的猜测是,如果 .json 文件作为漂亮的打印副原始文件读入,那么您的解决方案(以及我之前的尝试)将起作用——这是我之前的尝试和您的建议都被挂断的错误。我将添加到我的原始帖子中,请看一下!
    猜你喜欢
    • 2012-05-18
    • 2015-12-08
    • 2016-03-02
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多