迭代地将固定数量的行读入R中

时间:2016-01-16 20:48:35

标签: json r

我有一个我正在使用的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
    ]
  ]
}

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()创建的字符向量。

最后,我刚刚更改了最终赋值运算符,以便对输出的名称进行更多控制。