为什么一次只能读取一个.json文件?

时间:2019-01-24 22:06:52

标签: r for-loop jsonlite

我有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操作系统)。该程序确实会对单个提取产生负面影响,但对于循环,我得到了“无效字符字节”

更新1/25/2019

运行以下内容,但返回错误...

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时,便可以从JSON进行应用了,

e.x。

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依次给出了奇数字符,结果给出了无处不在的'--- --- ^'错误。不过,我能够提出一个解决方案,请参阅下文。我想将其发布给可能与.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))

1 个答案:

答案 0 :(得分:2)

  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)