Не удается открыть экспортированный файл Excel из-за проблемной текстовой строки

У меня есть следующие данные:

structure(list(QB5B_2 = structure("Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui composent l'Union Européenne ne sont pas d'accord entre elles sur la stratégie à adopter en ce qui les concerne . Exemple les Gafa payent des impots en Irlande car leurs si<ef>", label = "test", format.spss = "A255", display_width = 0L)), row.names = c(NA, 
-1L), class = c("tbl_df", "tbl", "data.frame"))

Когда я смотрю на эти данные в панели просмотра RStudios, они выглядят как правильный текст на французском языке:

View(problem) показывает:

Однако при просмотре данных в консоли это дает мне:

# A tibble: 1 x 1
  QB5B_2                                                                                                                 
  <chr>                                                                                                                  
1 "Car les GAFA sont des soci\xc3\xa9t\xc3\xa9s Am\xc3\xa9ricaines et de plus les gouvernements qui composent l'Union Eu~

Итак, ясно, что есть какая-то проблема с кодировкой символов.

Теперь, когда я пытаюсь экспортировать файл в Excel с помощью:

library(writexl)
write_xlsx(problem, "test.xlsx")

он выполняет экспорт, но я не могу открыть файл в Excel и вместо этого получаю сообщение об ошибке, что возникла проблема. Боковое примечание: я могу отлично импортировать файл Excel, например. readxl::read_xlsx("test.xlsx")

Итак два вопроса:

  • Как я могу предотвратить эти проблемы с персонажем в первую очередь? В идеале я бы не получил эти странные \xc3\ вещи в данных.
  • Есть ли способ экспортировать файл, чтобы его можно было правильно открыть в Excel?

\xc3 является частью кодировки символов UTF-8. Установлена ​​ли у вас кодировка при импорте файла encoding = "UTF-8"? Смотрите здесь.

Mario Niepel 09.12.2020 20:27

Хороший вопрос. Я собираю свои данные через API, но я думаю, что по умолчанию будет кодировка UTF-8, да. Но я всегда думал, что UTF-8 - это что-то. хорошо и должно обрабатываться всеми программными инструментами, поэтому я ожидаю, что Excel сможет открывать такие символы?

deschen 09.12.2020 20:29

На самом деле после загрузки данных через API через httr:POST у меня есть следующая строка кода: download_content <- content(download_request, encoding = "UTF-8")

deschen 09.12.2020 20:33

(но если оставить часть «encoding = UTF-8», ничего не изменится в данных (только что попробовал).

deschen 09.12.2020 20:39

Мне кажется, что проблема не в R. Он принимает специальный символ и правильно выполняет кодировку UTF-8 в соответствии с таблицей данных специальных символов. Речь идет о том, как данные экспортируются в Excel. Таким образом, цель не в том, чтобы «избавиться» от странных символов/кодов. Они правильные. Вот почему Excel не принимает его. Я мало что знаю об Excel, но есть ли возможность специально импортировать UTF-8 (если только это не значение по умолчанию)?

Mario Niepel 09.12.2020 21:30

При копировании и вставке этого определения structure() на моем компьютере оно правильно отображается в консоли, и я могу сохранить его в Excel, который открывается с правильными акцентами. Это на американской винде. Поэтому я думаю, что проблема в шагах API и R, а не в Excel.

Alexlok 09.12.2020 21:56

Хорошо, с вашей структурой Encoding(problem$QB5B_2) это latin1, я могу воспроизвести вашу проблему с Encoding(problem$QB5B_2) <- "UTF-8" и решить ее, установив Encoding() <- "latin1". Я подозреваю, что текст на самом деле был Latin1, но API просто притворяется, что это UTF-8 без преобразования.

Alexlok 09.12.2020 22:00

Кажется, есть проблема с кодировкой Excel и UTF-8. Подробнее см. здесь: stackoverflow.com/questions/6002256/…

Mario Niepel 09.12.2020 22:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
188
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я подозреваю, что текст на самом деле закодирован как latin1, но для кодировки установлено значение UTF-8. Итак, R пытается прочитать latin1, как если бы это была UTF-8, и ошибается.

# by default, R used latin1
> Encoding(problem$QB5B_2)
[1] "latin1"

# in that case, no problem to display it
> problem
# A tibble: 1 x 1
  QB5B_2                                                                          
  <chr>                                                                           
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui com~

# But the API set it as UTF-8
> Encoding(problem$QB5B_2) <- "UTF-8"
> problem
# A tibble: 1 x 1
  QB5B_2                                                                          
  <chr>                                                                           
1 Car les GAFA sont des soci\xe9t\xe9s Am\xe9ricaines et de plus les gouvernemen~

# You just need to convert the encoding back
> Encoding(problem$QB5B_2) <- "latin1"
> problem
# A tibble: 1 x 1
  QB5B_2                                                                          
  <chr>                                                                           
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui com~

См. также первый пример в ?Encoding, который очень похож. На французском компьютере языковой стандарт будет установлен на latin1, и вы можете использовать enc2native().

Ответ принят как подходящий

Что-то довольно странное, так как ваш ввод показывает двойную кавычку перед текстом, чего обычно не происходит при отображении содержимого символьного столбца в таблице. Посмотрите сразу после "1":

# A tibble: 1 x 1
 QB5B_2                                                                                                                 
 <chr>                                                                                                                  
1 "Car les GAFA sont des soci\xc3\xa9t\xc3\xa9s Am\xc3\xa9ricaines et de plus les gouvernements qui composent l'Union Eu~

Возможно, решение состоит в том, чтобы перекодировать переменную с помощью iconv():

problem$QB5B_2 <- iconv(problem$QB5B_2, sub = "byte")
problem
# A tibble: 1 x 1
   QB5B_2                                                                                                                
   <chr>                                                                                                                 
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui composent l'Union Européenne ne sont pas …

Другим было бы удалить первый символ:

problem$QB5B_2 <- str_remove(problem$QB5B_2, pattern = "$.")
problem
# A tibble: 1 x 1
   QB5B_2                                                                                                                
   <chr>                                                                                                                 
1 Car les GAFA sont des sociétés Américaines et de plus les gouvernements qui composent l'Union Européenne ne sont pas …

Это не показывает, как избежать проблемы в первую очередь, но должно разобраться.

Одна из трудностей при выполнении отладки здесь заключается в том, что dput(), который вы, вероятно, использовали для репликации контента, не решает проблему...

Невероятно, второе решение, которое вы предоставили, решило проблему для меня. Я до сих пор не уверен, как и где возникла проблема, но я исправил ее, по крайней мере, для этого примера.

deschen 13.12.2020 19:35

Другие вопросы по теме