R - 如何从JSON数据中删除特殊字符+转义序列,以便我可以使用JSONLITE?

时间:2015-10-31 17:19:19

标签: json r twitter lexical-analysis

直到下面提供大量信息,数据,代码等,最终得到解决。所以第一部分只是一个解释。

解释 - 自动从Twitter中提取推文的程序。出于某种原因,我将我关心的某些值(描述,位置,TweetID等)存储到逗号分隔的CSV文件中。我使用HTTR来" GET"推文,HTTR::content函数来存储它们,然后使用jsonlite::fromJSON(toJSON( ))将它们转换为更可行的形式。这在90%的情况下有效,但有时推文中嵌​​入了隐形转义字符。注意事项++中显示的\003GS以及其他此类特殊字符。这些导致jsonlite崩溃。我想删除它们。

所以适用于90%推文的代码如下所示:

mentions = GET(final_url, sig)
json = content(mentions)
json2 = jsonlite::fromJSON(toJSON(json))
allMentions = json2$statuses
colNames = names( unlist(allMentions[1,], use.names=TRUE ) )

然后用更多代码来实际解析推文并提取诸如user_id,text和latitude之类的内容。

在json2 = line崩溃。错误:

Error: lexical error: invalid character inside string.
  Foundation and 42nd President of the United States. Follow 
              (right here) ------^

或者:

Error: lexical error: invalid character inside string.
   No Mission Too Difficult, No Sacrifice Too Great, Duty First. DAV, VFW.
                               (right here) ------^

所以产生第一个错误的第一组推文,在notepad ++中显示了一个转义字符003之后。在第二个,你可以看到一个" GS"伟大的人物。

所以尝试修复是使用Gsub。替换特殊字符。问题是,由于某种原因,我的数据不再是UTF-8格式。所以我转换为UTF-8。

json = content(mentions)
json = gsub("[\001-\026]*", "", json, fixed=TRUE)
json = iconv(json, "UTF-8")
json2 = jsonlite::fromJSON(toJSON(json))
allMentions = json2$statuses

现在jsonlite部分有效!完美,但不是真的。

现在我崩溃了" allMentions = json2 $状态"

    $ operator is invalid for atomic vectors

这是有道理的,因为现在json2的输出是....

   [1] "NA"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
   [2] "list(completed_in = 0.131, max_id = 660500744261382144, max_id_str =        \"660500744261382146\", next_results = \"?      max_id=660499749334859776&q=%40HillaryClinton%20until%3A2015-11-     01&lang=en&count=100&include_entities=1&result_type=recent\", query = \"%40HillaryClinton+until%3A2015-11-01\", refresh_url = \"?since_id=660500744261382146&q=%40HillaryClinton%20until%3A2015-11-01&lang=en&result_type=recent&include_entities=1\", count = 100, since_id = 658634677922738176, since_id_str = \"658634677922738176\")"

这让我感到茫然。我现在是否坚持从这一端解决错误,并追捕这一点,并冒险搞砸了之前对我有用的东西?我是否会回去试图找出如何以其他方式摆脱那些逃脱角色/隐形人物?

对这些错误的任何建议都会得到很多赞赏。

1 个答案:

答案 0 :(得分:0)

好的,这可能不是一个完美的答案 - 我没有R经验。

关于@pinoybreed808的生物:

No Mission Too Difficult, No Sacrifice Too Great, Duty First. DAV, VFW.

Duty First之后和.实际U+001D之前显示不寻常的字符 - 我不知道为什么他们&#39 ;重新使用它,但有一些策略来处理这样的不寻常的字符。

首先,您可以简单gsub将它们排除在外 - 尽管我不确定R语法,但它并不像您正确捕捉角色一样。

其次,您可以在存储之前尝试URL编码数据。这会将角色变成%1D

第三,我不明白为什么这个角色会导致JSONlite出现问题。可能值得在R或JSONlite中提出一个关于它如何处理奇怪字符的错误。