找不到任何解决方法如何加载巨大的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。我想知道它是否是最有效的方式,但我测试的其他脚本很慢并且经常会遇到一些编码问题。
答案 0 :(得分:0)
试试这个:
library(jsonlite)
df <- as.data.frame(fromJSON('yelp_academic_dataset_review.json', flatten=TRUE))
然后,一旦数据帧删除了您不需要的列。
如果您不想在导入文件之前操作文件,我不确定您在R中有哪些选项。或者,您可以复制文件,然后使用{{删除文本列3}},然后将副本导入R,然后删除副本。