Как прочитать файл csv с неизвестным форматированием и неизвестной кодировкой в ​​программе R? (пример файла предоставлен)

Я изо всех сил пытался прочитать файл CSV в r, но потерпел неудачу. Я предоставил образец файла по следующей ссылке Gdrive.

Данные

Я обнаружил, что это файл с разделителями табуляции, открыв его в текстовом редакторе. Файл читается в Excel без проблем. Но когда я пытаюсь прочитать его в R, используя пакет «readr» или базовые пакеты r, это не удается. Не уверен, почему. Я пробовал разные кодировки, такие как UTF-8. UTF-16, UTF16LE. Не могли бы вы помочь мне написать правильный скрипт для чтения этого файла. В настоящее время я конвертирую этот файл в excel с разделителями-запятыми для чтения в R. Но я уверен, что должно быть что-то, что я делаю неправильно. Любая помощь будет оценена по достоинству.

Спасибо, Амаль.

PS: Я не понимаю, как Excel читает файл без каких-либо параметров? Можем ли мы построить такую ​​же логику в R для чтения любого файла?


person Amal Joy    schedule 11.05.2020    source источник


Ответы (1)


Это проблема кодирования, связанная с Windows.

Когда я открываю ваш файл в Notepad++, он сообщает мне, что он закодирован как UCS-2 LE BOM. Есть трюк для чтения файлов с необычными кодировками в R. В вашем случае это, кажется, помогает:

read.delim(con <- file("temp.csv", encoding = "UCS-2LE"))

(адаптировано из R: не может читать юникод текстовые файлы даже при указании кодировки).

Кстати, «CSV» означает «значения, разделенные запятыми». Значения в этом файле разделены табуляцией, поэтому во избежание путаницы следует присвоить ему суффикс .tsv или .txt, а не .csv.

Что касается вашего второго вопроса, можем ли мы построить ту же логику в R, чтобы угадывать кодировку, разделители и читать во многих типах файлов, не указывая явно, что такое кодировка и разделитель - да, это, безусловно, возможно. Желательно ли это, я не уверен.

person Peter Ellis    schedule 11.05.2020
comment
Спасибо, @peter за ответ. Ваше решение сработало. Идеальный. Проблема заключалась в том, что кодировка файла — UTF-16LE, которую read_delim в настоящее время не может прочитать. Я использовал базу read.delim и file(), чтобы указать кодировку: read.delim(file("temp.csv", encoding = "UTF-16LE"), sep = "\t") Это помогло мне. Еще раз спасибо за то, что указали мне правильное направление. - person Amal Joy; 11.05.2020