我有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
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))
答案 0 :(得分:2)
for
循环永远不会返回任何内容,因此您必须自己保存所有有价值的数据。as.data.frame(i)
,这将创建一个仅包含一个元素(即文件名)的框架,可能不是您想要保留的内容。fromJSON(file(i),...)
。由于您要将这些图像捕获到一帧中,因此我建议采取以下措施:
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)