2015-10-31 1 views
1

Идём и предоставляем тонну информации ниже с данными, кодом и т. Д., Чтобы окончательно решить эту проблему. Поэтому первая часть будет просто объяснением.R - Как удалить специальные символы + escape-последовательности из данных JSON, чтобы я мог использовать JSONLITE?

Пояснение - Программа автоматического извлечения твитов из Twitter. По соображениям, я сохраняю определенные значения от них, которые меня волнуют (описание, местоположение, TweetID и т. Д.) В CSV-файл с разделителями-запятыми. Я использую HTTR для «GET» твитов, функцию HTTR::content для их сохранения, а затем конвертируйте их в более работоспособную форму с помощью jsonlite::fromJSON(toJSON()). Это работает 90% времени, но иногда в твитах есть невидимые escape-символы, встроенные в них. Такие вещи, как \003, GS, как он появляется в Notepad ++, и другие такие специальные символы. Это приводит к сбою джсонлита. Я бы хотел их удалить.

Так код, который работает на 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_ids, текст и широты.

Это аварии здесь, на json2 = линии. с ошибкой:

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) ------^ 

Таким образом, первый набор твитов, который производит первую ошибку, то в блокноте ++ показывает экранирующего символа 003 после того, как из. Во втором вы можете увидеть символ «GS» после Великого.

Ошибка 0: попытка использовать 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\")" 

Это ставит меня в потеря. Должен ли я продолжать исправлять ошибку с этой цели сейчас и охотиться на нее, и рисковать тем, что это заставило меня работать раньше? Возвращаюсь ли я к тому, чтобы выяснить, как избавиться от этих символов Escape/невидимых персонажей другим способом?

Любой совет по этим ошибкам будет встречен с большой благодарностью.

+0

У вас есть идентификатор статуса для одного из проблемных твитов? Может помочь выявить проблему. –

+0

Конечно, я могу это предоставить. – Jibril

+0

TweetID: 658634677922738176 Профиль пользователя Bill Clinton. Все его твиты вызывают проблему, потому что escape-символ 003 существует в его описании профиля. – Jibril

ответ

0

Хорошо, это может быть не идеальный ответ - я не испытываю с R.

Что касается био @pinoybreed808:

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

Необычный персонаж появляется после Duty First и перед . это на самом деле U+001D - я понятия не имею почему они используют его, но есть пара стратегий для решения таких необычных персонажей.

Во-первых, вы можете просто gsub их - хотя я не уверен в синтаксисе R, это не похоже, что вы правильно захватили персонажа.

Во-вторых, вы можете попробовать URL-адрес Кодирование данных перед его сохранением. Это превратит персонажа в %1D.

В-третьих, я не понимаю, почему этот персонаж вызывает проблемы для JSONlite. Возможно, стоит собрать ошибку в R или JSONlite о том, как она справляется со странными символами.

+0

Привет, сэр. Спасибо за ввод. Я попытался использовать gsub как метод. Хотя мой текущий «тест» не учитывает символ U + 001D из этого твита, я тестирую небольшое подмножество с другим примером из профиля Билла Клинтона, где у него есть escape-символ \ 003. Как только я делаю gsub в этом случае, jsonlite прекрасно работает. Проблема заключается в том, что результат теперь работает с остальной частью моего кода. Я перехожу к статусу json2 $ и получаю атомную векторную ошибку. – Jibril

Смежные вопросы