在r

时间:2017-01-25 23:41:54

标签: json r

找不到任何解决方法如何加载巨大的JSON。我尝试着名的Yelp数据集。它是3.2 GB,我想分析10列中的9列。我需要跳过导入$text列,这将为我提供更轻的文件加载。可能约为-70%。我不想操纵文件。

我尝试了很多库并且卡住了。我找到了data.frame应用pipe函数的解决方案:

df <- read.table(pipe("cut -f1,5,28 myFile.txt")) 来自这个帖子:Ways to read only select columns from a file into R? (A happy medium between `read.table` and `scan`?)

如何为JSON做到这一点?我想这样做:

json <- read.table(pipe("cut -text yelp_academic_dataset_review.json"))

但这当然会因格式错误而引发错误。没有用正则表达式解析整个文件有没有可能吗?

修改

一行结构:(甚至不能全部计算)

{"review_id":"vT2PALXWX794iUOoSnNXSA","user_id":"uKGWRd4fONB1cXXpU73urg","business_id":"D7FK-xpG4LFIxpMauvUStQ","stars":1,"date":"2016-10-31","text":"some long text here","useful":0,"funny":0,"cool":0,"type":"review"}

第二次编辑

最后,我创建了一个循环,将所有数据转换为csv文件,省略了不需要的列。它很慢但我从3.2 gb获得了150 mb(拉链)。

# files to process
  filepath <- jfile1
  fcsv <- "c:/Users/cp/Documents/R DATA/Yelp/tests/reviews.csv"
  write.table(x = paste(colns, collapse=","), file = fcsv, quote = F, row.names = F, col.names = F)

  con = file(filepath, "r")

  while ( TRUE ) {
    line = readLines(con, n = 1)
    if ( length(line) == 0 ) {
      break
    }
    # regex process
    d <- NULL
    for (i in rcols) {
      pst <- paste(".*\"",colns[i],"\":*(.*?) *,\"",colns[i+1],"\":.*", sep="")
      w <- sub(pst, "\\1", line)
      d <- cbind(d, noquote(w))
    }
    # save on the fly
    write.table(x = paste(d, collapse = ","), file = fcsv, append = T, quote = F, row.names = F, col.names = F)

  }
  close(con)

它也可以保存到json。我想知道它是否是最有效的方式,但我测试的其他脚本很慢并且经常会遇到一些编码问题。

1 个答案:

答案 0 :(得分:0)

试试这个:

library(jsonlite)

df <- as.data.frame(fromJSON('yelp_academic_dataset_review.json', flatten=TRUE))

然后,一旦数据帧删除了您不需要的列。

如果您不想在导入文件之前操作文件,我不确定您在R中有哪些选项。或者,您可以复制文件,然后使用{{删除文本列3}},然后将副本导入R,然后删除副本。