Не удается открыть экспортированный файл 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?

person deschen    schedule 09.12.2020    source источник
comment
\ Xc3 является частью кодировки символов UTF-8. Установлена ​​ли у вас кодировка при импорте файла с помощью encoding = "UTF-8"? См. здесь.   -  person Mario Niepel    schedule 09.12.2020
comment
Хороший вопрос. Я собираю свои данные через API, но я думаю, что по умолчанию будет кодировка UTF-8, да. Но я всегда думал, что UTF-8 - это что-то. хорошо и должно обрабатываться всеми программными инструментами, поэтому я ожидаю, что Excel сможет открывать такие символы?   -  person deschen    schedule 09.12.2020
comment
Фактически после загрузки данных через API через httr:POST у меня появляется следующая строка кода: download_content <- content(download_request, encoding = "UTF-8")   -  person deschen    schedule 09.12.2020
comment
(но оставив часть encoding = UTF-8, ничего не меняет в данных (только что попробовал).   -  person deschen    schedule 09.12.2020
comment
Мне кажется, что проблема не в R. Он принимает специальный символ и правильно выполняет кодировку UTF-8 в соответствии с таблицей данных специальных символов. Это вопрос того, как данные экспортируются в Excel. Так что цель не в том, чтобы «избавиться» от странных символов / кодов. Они правы. Вот почему Excel его не принимает. Я мало что знаю об Excel, но есть ли возможность специально импортировать UTF-8 (если это тоже не используется по умолчанию)?   -  person Mario Niepel    schedule 09.12.2020
comment
При копировании и вставке этого определения structure() на моем компьютере оно правильно отображается в консоли, и я могу сохранить его в Excel, который открывается с правильными акцентами. Это в американской Windows. Поэтому я думаю, что проблема заключается в этапах API и R, а не в Excel.   -  person Alexlok    schedule 09.12.2020
comment
Хорошо, с вашей структурой Encoding(problem$QB5B_2) является latin1, я могу воспроизвести вашу проблему с Encoding(problem$QB5B_2) <- "UTF-8" и решить ее, установив Encoding() <- "latin1". Я подозреваю, что текст на самом деле был Latin1, но API просто притворяется UTF-8 без преобразования.   -  person Alexlok    schedule 10.12.2020
comment
Похоже, проблема с кодировкой Excel и UTF-8. Дополнительную информацию см. Здесь: stackoverflow.com/questions/6002256/   -  person Mario Niepel    schedule 10.12.2020


Ответы (2)


Что-то довольно странно, поскольку ваш ввод показывает двойные кавычки перед текстом, чего обычно не происходит при отображении содержимого символьного столбца в тиббле. Посмотрите сразу после 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(), который вы, вероятно, использовали для репликации контента, не сохраняет проблему ...

person Alexandre Courtiol    schedule 11.12.2020
comment
Невероятно, но второе решение, которое вы предоставили, действительно помогло мне решить проблему. Я все еще не уверен, как и где возникла проблема, но я исправил ее, по крайней мере, для этого примера. - person deschen; 13.12.2020

Я подозреваю, что текст на самом деле закодирован как 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().

person Alexlok    schedule 09.12.2020