为什么我一次只能读取一个 .json 文件?
Why can I only read one .json file at a time?
我有 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 OS)。这确实 bot 对单次提取有负面影响,但对于循环我得到“无效字符字节”
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)------^
最新更新
认为我找到了解决疯狂 'bytes' 问题的方法。当我 运行 读取 .json 文件上的行时,我可以从 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}
需要的步骤
apply readLines to all 500 .json files in JSON folder
apply fromJSON to files from step.1
create a data.frame that returns entries if list (fromJSON) contains $element$subdata$data.
想法?
解决方案(解决方法?)
不幸的是,fromJSON 仍然 运行 遇到 .json 文件的问题。我的猜测是我的 GET 方法 (httr) 无法 wait/delay 并加载 'pretty print' ,因此正在获取原始的 .json ,这反过来又给出了奇怪的字符,结果给出无处不在的 '------^' 错误。尽管如此,我还是能够整理出一个解决方案,请参见下文。我想 post 为将来可能遇到与 .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))
for
循环从不 return 任何东西,所以你必须自己保存所有有价值的数据。
- 您调用
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)
我有 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 OS)。这确实 bot 对单次提取有负面影响,但对于循环我得到“无效字符字节”
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)------^
最新更新 认为我找到了解决疯狂 'bytes' 问题的方法。当我 运行 读取 .json 文件上的行时,我可以从 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}
需要的步骤
apply readLines to all 500 .json files in JSON folder apply fromJSON to files from step.1 create a data.frame that returns entries if list (fromJSON) contains $element$subdata$data.
想法?
解决方案(解决方法?)
不幸的是,fromJSON 仍然 运行 遇到 .json 文件的问题。我的猜测是我的 GET 方法 (httr) 无法 wait/delay 并加载 'pretty print' ,因此正在获取原始的 .json ,这反过来又给出了奇怪的字符,结果给出无处不在的 '------^' 错误。尽管如此,我还是能够整理出一个解决方案,请参见下文。我想 post 为将来可能遇到与 .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))
for
循环从不 return 任何东西,所以你必须自己保存所有有价值的数据。- 您调用
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)