r: недопустимая многобайтовая строка

<p>я использую read.delim (имя файла) без каких-либо параметров, чтобы прочитать текстовый файл с разделителями табуляции в r.</p><pre><code>df = read.delim(file) </code></pre><p>это сработало как задумано. теперь у меня есть странное сообщение об ошибке, и я не могу понять его:</p><pre><code>error in type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0l)) : invalid multibyte string at '<fd>' calls: read.delim -> read.table -> type.convert execution halted </code></pre><p>кто-нибудь может объяснить, что такое многобайтовая строка? что значит fd? есть ли другие способы прочитать файл вкладки в r? у меня есть заголовки столбцов и строк, которые не имеют данных для всех столбцов.</p>

<p>я понимаю, что уже довольно поздно, но у меня была похожая проблема, и я решил опубликовать то, что сработало для меня. я использовал утилиту <a href="http://www.gnu.org/s/libiconv/documentation/libiconv/iconv.1.html">iconv</a> (например, <code>"iconv file.pcl -f utf-8 -t iso-8859-1 -c"</code>). опция "-c" пропускает символы, которые невозможно перевести.</p>

<p>у меня была такая же странная проблема с файлом из программы e-prime (edat -> spss преобразование), но потом я обнаружил, что есть много дополнительных кодировок, которые вы можете использовать. это помогло мне:</p><pre><code>tbl <- read.delim("dir/file.txt", fileencoding="ucs-2le") </code></pre>

<p>если вы хотите r-решение, вот небольшая удобная функция, которую я иногда использую, чтобы найти, где скрывается нарушающий (multibyte) символ. обратите внимание, что это символ <em>следующий</em> того, что печатается. это работает, потому что <code>print</code> будет работать нормально, но <code>substr</code> выдает ошибку, когда присутствуют многобайтовые символы.</p><pre><code>find\_offending\_character <- function(x, maxstringlength=256){ print(x) for (c in 1:maxstringlength){ offendingchar <- substr(x,c,c) #print(offendingchar) #uncomment if you want the indiv characters printed #the next character is the offending multibyte character } } string\_vector <- c("test", "se\x96ora", "works fine") lapply(string\_vector, find\_offending\_character) </code></pre><p>я исправляю этот персонаж и запускаю его снова. надеюсь, что это помогает кому-то, кто сталкивается с <code>invalid multibyte string</code> ошибка.</p>

<p>это произошло со мной, потому что у меня был символ "авторского права" в одной из моих строк! как только он был удален, проблема решена.</p><p>хорошее практическое правило: убедитесь, что символы, не отображаемые на клавиатуре, удалены, если вы видите эту ошибку.</p>

<p>я понял, что leafpad является подходящим и простым текстовым редактором для просмотра и сохранения/преобразования в определенных наборах символов - по крайней мере, в мире linux.</p><p>я использовал это, чтобы сохранить latin-15 в utf-8, и это сработало.</p>