从R中的.txt文件解析JSON数组-几个大文件

从R中的.txt文件解析JSON数组-几个大文件,json,r,parsing,twitter,tweets,Json,R,Parsing,Twitter,Tweets,我最近从Twitter上下载了大量推文。我的起点是大约400个包含Tweet ID的.txt文件。运行一个工具后,使用Tweet id从Twitter中刮取Tweet,对于我拥有的每个带有大量Tweet id列表的.txt文件,我会得到一个包含JSON字符串的非常大的.txt文件。每个JSON字符串都包含关于Tweet的所有信息。下面是指向我的一个驱动器的超链接,其中包含我正在处理的文件(一旦我使其正常工作,我会将代码应用于其他文件): 我一直在尝试解析每个文件中的每个JSON字符串,但没有成

我最近从Twitter上下载了大量推文。我的起点是大约400个包含Tweet ID的.txt文件。运行一个工具后,使用Tweet id从Twitter中刮取Tweet,对于我拥有的每个带有大量Tweet id列表的.txt文件,我会得到一个包含JSON字符串的非常大的.txt文件。每个JSON字符串都包含关于Tweet的所有信息。下面是指向我的一个驱动器的超链接,其中包含我正在处理的文件(一旦我使其正常工作,我会将代码应用于其他文件):

我一直在尝试解析每个文件中的每个JSON字符串,但没有成功。我的目标是将每个文件转换成R中的一个大数据帧。每一行都是一条推文,每一列都是推文中的一个特性。考虑到它们的性质,“文本”列将非常大(它将包含推文的主体),而“位置”将很短。每个JSON字符串的格式相同,每个文件最多可以有一百万个字符串

我尝试了几种方法(如下所示)来获得我需要的东西,但没有成功:

library('RJSONIO')library('RCurl')
json_file <- fromJSON("Pashawar_test.txt")
json_file2 = RJSONIO::fromJSON(json_file)
library('RJSONIO')library('RCurl'))

json_文件在
jsonlite
包的
stream_函数中尝试。您的文件每行包含一个JSON。您可以逐行阅读并通过
从JSON
转换,也可以直接使用
中的stream\u,这正是为处理此类文件/连接而设计的

require(jsonlite)
filepath<-"path/to/your/file"
#method A: read each line and convert
content<-readLines(filepath)
#this will take a while
res<-lapply(content,fromJSON)

#method B: use stream_in
con<-file(filepath,open="rt")
#this will take a while
res<-stream_in(con)
require(jsonlite)

filepath尝试
jsonlite
包的
stream\u功能。您的文件每行包含一个JSON。您可以逐行阅读并通过
从JSON
转换,也可以直接使用
中的stream\u,这正是为处理此类文件/连接而设计的

require(jsonlite)
filepath<-"path/to/your/file"
#method A: read each line and convert
content<-readLines(filepath)
#this will take a while
res<-lapply(content,fromJSON)

#method B: use stream_in
con<-file(filepath,open="rt")
#this will take a while
res<-stream_in(con)
require(jsonlite)

filepath这是一个[n]ewline[d]elimited[json](ndjson)文件,它是为包定制的。所述包比
jsonlite::stream_in()
快得多,生成“完全平坦”的数据帧。后一部分(“完全平坦”)并不总是人们真正需要的,因为它可以形成一个非常宽的结构(在您的例子中,它扩展了所有嵌套的组件,可以生成1012列),但是您可以快速获得所需的内容,而不必自己去尝试任何东西

str()
甚至
scape()
的输出太大,无法在此处显示,但这就是您使用它的方式

请注意,我重命名了您的文件,因为
.json.gz
通常是ndjson的存储方式(我的包可以处理gzip的json文件):

但是

您已经成功创建了非常不一致的JSON。并非所有具有嵌套内容的字段都是以这种方式表示的,新来的钻取者会发现,编写防弹SQL有点挑战性,它将帮助他们在所有场景中不需要这些数据

如果你只需要从“已经平坦”的钻头中获取数据,那么尝试一下钻孔


如果您需要嵌套数据,并且不想与从
jsonlite::stream_in()
中取消测试或与取消测试的钻取进行斗争,那么,我建议使用第一个示例中提到的
ndjson
,然后将真正需要的位切割成更易于管理、整洁的数据帧。

这是一个[n]ewline[d]elimited[json](ndjson)文件,该文件是为该软件包量身定制的。该软件包比
jsonlite::stream_in()
的速度快得多,并生成一个“完全平坦”的数据帧。后一部分(“完全平坦”)并不总是人们真正需要的,因为它可以形成一个非常宽的结构(在您的例子中,它扩展了所有嵌套组件,因此有1012列)但是您可以快速获得所需的内容,而无需自己取消任何测试

str()
甚至
scape()
的输出太大,无法在此处显示,但这就是您使用它的方式

请注意,我重命名了您的文件,因为
.json.gz
通常是ndjson的存储方式(我的包可以处理gzip的json文件):

但是

您已经成功地创建了真正不一致的JSON。并非所有具有嵌套内容的字段都以这种方式一致地表示,新手将发现编写防弹SQL有点困难,它将帮助他们在所有场景中都不需要这些数据

如果你只需要从“已经平坦”的钻头中获取数据,那么尝试一下钻孔


如果您需要嵌套的数据,并且不想与从
jsonlite::stream_in()中取消测试作斗争
或者正在努力进行未测试的钻取,那么,我建议使用第一个示例中提到的
ndjson
,然后将您真正需要的比特切割成更易于管理、更整洁的数据帧。

nicola-感谢您的建议。我运行了您建议的代码,它创建了“res”,在右上角的窗口中是一个包含75008的“数据”30个变量的观察结果。当我试图查看时,终端说:“视图中的错误:'名称'属性[1]必须与向量[0]长度相同。”。你能建议我能做些什么来克服这个问题吗?我的目标是将每个parson JSON字符串视为一行,将每个变量视为一列。然后我可以向下滚动,并开始确定我应该保留和放弃什么。nicola-感谢你的建议。我运行了你建议的代码,并创建了“res”,它在右上角的窗口中是一个“data”with 75008对30个变量的观察结果。当我试图查看时,终端说:“视图中出现错误:'名称'属性[1]必须与向量[0]长度相同。”。你能建议我能做些什么来克服这个问题吗?我的目标是将每个parson JSON字符串视为一行,每个变量视为一列。然后我可以向下滚动并开始确定应该保留和丢弃哪些内容。Hrdrmstr-我不知道如何将其转换为.JSON.gz。我通过将名称调整为.txt文件来运行它。changi有什么好处将它转换成一个.json.gz文件,如果有,我如何转换它呢
library(ndjson)
library(tidyverse)

twdf <- tbl_df(ndjson::stream_in("~/Desktop/pashwar-test.json.gz"))
## dim(twdf)
## [1] 75008  1012
library(sergeant)
library(tidyverse)

db <- src_drill("dbserver")
twdf <- tbl(db, "dfs.json.`pashwar-test.json.gz`")

glimpse(twdf)
## Observations: 25
## Variables: 28
## $ extended_entities         <chr> "{\"media\":[]}", "{\"media\":[]}", "{\"m...
## $ quoted_status             <chr> "{\"entities\":{\"hashtags\":[],\"symbols...
## $ in_reply_to_status_id_str <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ in_reply_to_status_id     <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ created_at                <chr> "Tue Dec 16 10:13:47 +0000 2014", "Tue De...
## $ in_reply_to_user_id_str   <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ source                    <chr> "<a href=\"http://twitter.com/download/an...
## $ retweeted_status          <chr> "{\"created_at\":\"Tue Dec 16 09:28:17 +0...
## $ quoted_status_id          <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ retweet_count             <int> 220, 109, 9, 103, 0, 398, 0, 11, 472, 88,...
## $ retweeted                 <chr> "false", "false", "false", "false", "fals...
## $ geo                       <chr> "{\"coordinates\":[]}", "{\"coordinates\"...
## $ is_quote_status           <chr> "false", "false", "false", "false", "fals...
## $ in_reply_to_screen_name   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ id_str                    <dbl> 5.447975e+17, 5.447975e+17, 5.447975e+17,...
## $ in_reply_to_user_id       <int> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ favorite_count            <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ id                        <dbl> 5.447975e+17, 5.447975e+17, 5.447975e+17,...
## $ text                      <chr> "RT @afneil: Heart-breaking beyond words:...
## $ place                     <chr> "{\"bounding_box\":{\"coordinates\":[]},\...
## $ lang                      <chr> "en", "en", "en", "en", "en", "en", "en",...
## $ favorited                 <chr> "false", "false", "false", "false", "fals...
## $ possibly_sensitive        <chr> NA, "false", NA, "false", NA, "false", NA...
## $ coordinates               <chr> "{\"coordinates\":[]}", "{\"coordinates\"...
## $ truncated                 <chr> "false", "false", "false", "false", "fals...
## $ entities                  <chr> "{\"user_mentions\":[{\"screen_name\":\"a...
## $ quoted_status_id_str      <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ user                      <chr> "{\"id\":25968369,\"id_str\":\"25968369\"...