Идём и предоставляем тонну информации ниже с данными, кодом и т. Д., Чтобы окончательно решить эту проблему. Поэтому первая часть будет просто объяснением.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/невидимых персонажей другим способом?
Любой совет по этим ошибкам будет встречен с большой благодарностью.
У вас есть идентификатор статуса для одного из проблемных твитов? Может помочь выявить проблему. –
Конечно, я могу это предоставить. – Jibril
TweetID: 658634677922738176 Профиль пользователя Bill Clinton. Все его твиты вызывают проблему, потому что escape-символ 003 существует в его описании профиля. – Jibril