我有一个我正在使用的josn文件,它在一个文件中包含多个json对象。 R无法整体读取文件。但由于每个对象以固定间隔出现,我想迭代地将固定数量的行读入R.
在将单行读入R中存在许多SO问题,但我无法将这些解决方案扩展到固定数量的行。对于我的问题,我需要一次读16行R(例如1-16,17-32等)
我尝试过使用循环,但似乎无法正确使用语法:
## File
file <- "results.json"
## Create connection
con <- file(description=file, open="r")
## Loop over a file connection
for(i in 1:1000) {
tmp <- scan(file=con, nlines=16, quiet=TRUE)
data[i] <- fromJSON(tmp)
}
该文件包含1000多个此格式的对象:
{
"object": [
[
"a",
0
],
[
"b",
2
],
[
"c",
2
]
]
}
答案 0 :(得分:0)
这可能会有所帮助:
已编辑以使其使用列表并缩减为一个文件
## Loop over a file connection
data <- NULL
for(i in 1:1000) {
tmp <- scan(file=con, nlines=16, skip=(i-1)*16, quiet=TRUE)
data[[i]] <- fromJSON(tmp)
}
df <- Reduce(function(x, y) {paste(x, y, collapse = " ")})
你必须确保你不会超过文件的末尾; - )
答案 1 :(得分:0)
借助@tomtom的灵感,我找到了一个解决方案。
## File
file <- "results.json"
## Loop over a file
for(i in 1:1000) {
tmp <- paste(scan(file=file, what="character", sep="\n", nlines=16, skip=(i-1)*16, quiet=TRUE),collapse=" ")
assign(x = paste("data", i, sep = "_"), value = fromJSON(tmp))
}
我无法创建连接,因为每次尝试连接都会在文件完全读取之前关闭。所以我摆脱了这一步。
我必须包含what="character"
变量,因为scan()似乎默认需要一个数字。
我包含了sep="\n"
,paste()和collapse=" "
来创建单个字符串,而不是默认情况下scan()创建的字符向量。
最后,我刚刚更改了最终赋值运算符,以便对输出的名称进行更多控制。