Почему R читает заголовок UTF-8 как текст?

Я сохранил таблицу Excel как текст (*.txt). К сожалению, Excel не позволяет выбрать кодировку. Поэтому мне нужно открыть его в Блокноте (который открывается как ANSI) и сохранить как UTF-8. Затем, когда я прочитал это в R:

data <- read.csv("my_file.txt",header=TRUE,sep="\t",encoding="UTF-8")

он показывает имя первого столбца, начинающееся с «X.U.FEFF.». Я знаю, что это байты, зарезервированные для того, чтобы сообщить любой программе, что файл находится в формате UTF-8. Так что это не должно отображаться как текст! Это ошибка? Или я упускаю какую-то опцию? Заранее спасибо!


person Rodrigo    schedule 12.11.2013    source источник
comment
попробуйте с аргументом read.csv check.names=FALSE. Обратите внимание, что если вы используете это, вы не сможете напрямую ссылаться на столбцы с нотацией $.   -  person Matthew Plourde    schedule 12.11.2013
comment
Файлы UTF-8 не должны содержать знак порядка следования байтов, см. RFC 3629 для объяснения.   -  person zwol    schedule 12.11.2013
comment
Спасибо @Мэттью. Работает частично. X.U.FEFF исчез, но я больше не могу ссылаться на первый столбец по имени (хотя остальные все еще работают). Я все еще думаю, что это ошибка, которая будет решена в будущих версиях R.   -  person Rodrigo    schedule 12.11.2013
comment
Вы можете обращаться к ним по имени, если поместите их в кавычки, например, yourdf$"first col"   -  person Matthew Plourde    schedule 12.11.2013
comment
@ Зак, я видел несколько файлов UTF-8 с этими первыми байтами, поэтому подумал, что это правило. Не большая проблема, так как я всегда могу переименовать первый столбец, просто думаю, что когда-нибудь это должно быть решено.   -  person Rodrigo    schedule 12.11.2013
comment
@ Мэтью, этот второй трюк здесь не сработал.   -  person Rodrigo    schedule 12.11.2013
comment
Я нашел решение по адресу stackoverflow.com/questions/24568056/   -  person mqpasta    schedule 19.01.2021


Ответы (4)


Итак, я собирался дать вам инструкции о том, как вручную открыть файл, проверить и удалить спецификацию, но потом я заметил это (в ?file):

Начиная с R 3.0.0 кодировка «UTF-8-BOM» принимается и удаляет метку порядка байтов, если она присутствует (что часто бывает для файлов и веб-страниц, созданных приложениями Microsoft).

это означает, что если у вас достаточно новый интерпретатор R,

read.csv("my_file.txt", fileEncoding="UTF-8-BOM", ...other args...)

должен делать то, что вы хотите.

person zwol    schedule 12.11.2013
comment
хм почти там. Теперь X.U.FEFF. стал я.. - person Rodrigo; 12.11.2013
comment
Похоже, файл на самом деле не UTF-8. Есть ли способ показать нам шестнадцатеричный дамп первой строки файла? (В большинстве систем Unix head -1 my_file.txt | hexdump -C даст вам хороший шестнадцатеричный дамп, но я понятия не имею об эквиваленте Windows.) - person zwol; 13.11.2013
comment
В командной строке DOS это делает отладка. Первые три байта — EF BB BF. (Я сохранил файл в Блокноте 5.1 сборки 2600, Windows XP SP3, и он говорит, что формат UTF-8). Остальная часть строки представляет собой ASCII для имен столбцов. - person Rodrigo; 13.11.2013
comment
Мне нужно увидеть дамп всей строки (или хотя бы всего первого поля, т.е. до первого 09 включительно), а не только первых трех байтов. - person zwol; 13.11.2013
comment
Хм. После удаления спецификации первое поле состоит из всех заглавных букв ASCII, которые должны прекрасно входить в имя столбца фрейма данных. У вас действительно есть R 3.x? Это начинает выглядеть как ошибка в интерпретаторе. - person zwol; 13.11.2013
comment
Да, у меня R 3.0.1. Я скачал Notepad++, и он дает мне возможность сохранять со спецификацией и без нее. Кажется, R просто не может справиться со спецификацией. - person Rodrigo; 13.11.2013

большинство аргументов в read.csv являются фиктивными, включая fileEncoding.

вместо этого используйте read.table

 read.table("my_file.txt", header=TRUE, sep="\t", fileEncoding="UTF-8")
person Ricardo Saporta    schedule 12.11.2013
comment
С read.table я получаю сообщение об ошибке: Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : в строке 9191 не было 25 элементов. Мой прочитанный комментарий на самом деле сложнее, это: данные ‹- read.table(my_file.txt,header=TRUE,sep=\t,stringsAsFactors=FALSE,strip.white=TRUE,encoding=UTF-8,quote=) - person Rodrigo; 12.11.2013
comment
здорово!! Тогда это сработало. Теперь вам просто нужно очистить исходный файл;) Откройте его в текстовом редакторе (мне нравится возвышенный текст 3), перейдите к строке 9191 и проверьте его. - person Ricardo Saporta; 13.11.2013
comment
Спасибо, @Рикардо. Мне нужен был только comment.char=. Но теперь он ведет себя точно так же, как read.csv... :( - person Rodrigo; 13.11.2013

У меня была такая же проблема с загрузкой CSV-файла с использованием read.csvencoding="UTF-87-BOM"), read.table или read_csv из пакета readr. Ни одна из этих попыток не увенчалась успехом.

Я определенно не мог работать с тегом BOM, потому что при настройке моих данных (используя оба подхода subset() или df[df$var=="value",]) первая строка не учитывалась.

Наконец-то я нашел обходной путь, из-за которого тег BOM исчез. Используя функцию read.csv, я только что определил строковый вектор для имен столбцов в аргументе col.names = .... Это работает как шарм, и я могу без проблем подмножить свои данные.

Я использую R версии 3.5.0

person Mesozoik    schedule 06.08.2018

Возможное решение из комментариев:

Попробуйте это с аргументом read.csv check.names=FALSE. Обратите внимание, что если вы используете это, вы не сможете напрямую ссылаться на столбцы с нотацией $, если только вы не заключите имя в кавычки. Например: yourdf$"first col".

person Matthew Plourde    schedule 12.11.2013