Предупреждение "Неполная последняя строка" при попытке прочитать файл .csv в R

115

Я пытаюсь прочитать файл .csv в R и используя эту формулу:

pheasant<-read.table(file.choose(),header=TRUE,sep=",")

Я получаю это предупреждающее сообщение:

"incomplete final line found by readTableHeader on 'C:\Documents and Settings..."

Есть пара вещей, которые, как я думал, могли вызвать это предупреждение, но, к сожалению, я недостаточно знаю о R, чтобы самостоятельно диагностировать проблему, поэтому я решил опубликовать здесь в надежде, что кто-то другой сможет диагностировать это за меня!

  • файл .csv изначально был файлом Excel, который я сохранил в формате .csv
  • файл состоит из трех столбцов данных
  • каждый столбец данных имеет разную длину, то есть в каждом столбце разное количество значений
  • Я хочу сравнить средние значения (с использованием t-теста или эквивалента в зависимости от нормального / ненормального распределения) двух столбцов за раз, поэтому, например, t-тест между значениями столбца 1 и значениями столбца 2, затем t- проверка значений столбца 1 и столбца 3 и т. д.

Любая помощь или предложения будут серьезно оценены!

Кейт
источник
1
@Kate: не могли бы вы связать нас с самим файлом? У меня есть кое-какие идеи, но без файла сложно сказать, в чем проблема.
Джорис Мейс
Привет, Джорис - я не знаю, как это сделать, извини ...
Кейт
В первом столбце 1045 значений, во втором - 623 значения, а в третьем - 871, если это поможет ...? Все они представляют собой числовые значения в виде целых и половинных чисел, например 23, 24,5 и т. Д.
Кейт,
1
Я думаю, что проблема, потому что read.table помещает ваши данные во фрейм данных, который должен иметь равные длины столбцов.
Сэр Ксилем,
1
@ Джеймс: Нет, это не так. readTableHead (базовая функция c) читает первые 5 строк. Ошибка возникает там.
Джорис Мейс

Ответы:

135

Сообщение указывает, что последняя строка файла не заканчивается символом конца строки (EOL) (перевод строки ( \n) или возврат каретки + перевод строки ( \r\n)). Первоначальная цель этого сообщения заключалась в том, чтобы предупредить вас о том, что файл может быть неполным; большинство файлов данных имеют символ EOL как самый последний символ в файле.

Лекарство простое:

  1. Открыть файл
  2. Перейти к самой последней строке файла
  3. Поместите курсор в конец этой строки
  4. Нажмите return
  5. Сохраните файл
Хендрик Пон
источник
2
Это не последняя строка файла. Он читает заголовок, это ваши первые пять строк.
Джорис Мейс
@JorisMeys Однако сообщение об ошибке относится к последней строке файла. Выполнение описанных выше шагов действительно удаляет предупреждение.
WorldGov
@WorldGov «Неполная последняя строка» - это предупреждение (не ошибка), которое может появиться по разным причинам. В вашем случае это отсутствие окончательного EOL. В вашем случае нет возможности, чтобы предупреждение было выдано функцией readTableHeader, потому что она не читает последнюю строку. Следовательно, ваша проблема не такая, как у OP.
Джорис Мейс,
20

Проблему легко решить; это потому, что последняя строка ДОЛЖНА быть пустой.

Скажите, если ваш контент

line 1,
line2

измените это на

line 1,
line2
(empty line here)

Сегодня я столкнулся с такой проблемой, когда пытался использовать R для чтения файла JSON с помощью команды ниже:

json_data<-fromJSON(paste(readLines("json01.json"), collapse=""))

; и я решаю это описанным выше способом.

Винсент Джиа
источник
1
Используя сантехника для размещения R API, у меня была такая же проблема. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'предупреждение было устранено добавлением одной пустой строки в конце. Не уверен, почему это происходит.
HoofarLotusX
Тоже самое. Спасибо.
Megadeth
14

Вы действительно уверены, что выбрали файл .csv, а не файл .xls? Я могу воспроизвести ошибку, только если попытаюсь прочитать файл .xls. Если я попытаюсь прочитать файл .csv или любой другой текстовый файл, невозможно воссоздать полученную ошибку.

> Data <- read.table("test.csv",header=T,sep=",")
> Data <- read.table("test.xlsx",header=T,sep=",")
Warning message:
In read.table("test.xlsx", header = T, sep = ",") :
  incomplete final line found by readTableHeader on 'test.xlsx'

readTableHeadэто c-функция, которая дает ошибку. Он пытается прочитать первые n строк (стандартные первые 5), чтобы определить тип данных. Остальные данные считываются с помощью scan(). Так что проблема в формате файла.

Один из способов выяснить это - установить в качестве рабочего каталога каталог, в котором находится файл. Таким образом, вы увидите расширение файла, который вы читаете. Я знаю, что в Windows оно не отображается стандартно, поэтому вы можете поверить, что это csv, хотя это не так.

Следующее, что вам нужно сделать, это открыть файл в Блокноте или Wordpad (или другом редакторе) и убедиться, что формат эквивалентен моему файлу test.csv:

Test1,Test2,Test3
1,1,1
2,2,2
3,3,3
4,4,
5,5,
,6,

Этот файл предоставит вам следующий фрейм данных:

> read.table(testfile,header=T,sep=",")
  Test1 Test2 Test3
1     1     1     1
2     2     2     2
3     3     3     3
4     4     4    NA
5     5     5    NA
6    NA     6    NA

Формат csv, сохраненный в excel, разделяет все ячейки запятой. Пустые ячейки просто не имеют значения. read.table()может легко с этим справиться и прекрасно распознает пустые ячейки.

Джорис Мейс
источник
Предполагая, что это среда Windows 7, если Кейт просматривает файл, скопированный на рабочий стол или внутри папки, на значке файла .csv будет стоять буква «a», а на файле .xlsx - значок, который выглядит больше как рабочий лист. Это быстрый визуальный способ определения типа файла. Намного легче увидеть при сохранении на рабочем столе, поскольку значки больше. :)
Мишель
7

Используйте readLines()warn = FALSE), чтобы сначала прочитать файл в вектор символов.

После этого используйте text =опцию для чтения вектора во фрейм данных с помощьюread.table()

    pheasant <- read.table( 
        text = readLines(file.choose(), warn = FALSE), 
        header = TRUE,  
        sep = "," 
    )
Damian
источник
3

Я понял, что было предоставлено несколько ответов, но пока нет реального исправления.

Причина, как упоминалось выше, заключается в том, что в конце файла CSV отсутствует «Конец строки».

В то время как настоящее исправление должно исходить от Microsoft, необходимо открыть файл CSV с помощью текстового редактора и добавить строку в конце файла (например, нажать клавишу возврата). Я использую программное обеспечение ATOM в качестве редактора текста / кода, но подойдет практически любой базовый текстовый редактор.

А пока сообщите об ошибке в Microsoft.

Вопрос: Мне кажется, это проблема офиса 2016 года. У кого-нибудь есть проблема на ПК?

Николас Стифани
источник
2

Я получил такое же сообщение. Мое исправление включало: я удалил все дополнительные листы (вкладки) в файле .csv, удалил нечисловые символы, повторно сохранил файл с разделителями-запятыми и загрузил в R v 2.15.0 на стандартном языке:

имя файла <-read.csv ("имя файла", заголовок = ИСТИНА)

В качестве дополнительной меры предосторожности я закрыл программу и снова открыл ее перед загрузкой csv.

Erik
источник
2

В различных европейских странах, поскольку запятая используется как десятичная точка, вместо нее следует использовать функцию read.csv2.

Ифань
источник
2

Я решил эту проблему, изменив кодировку в аргументе read.table с fileEncoding = "UTF-16" на fileEncoding = "UTF-8".

Деян Плевлякушич
источник
1

Проблема, которую вы описываете, возникла у меня, когда я переименовал файл .xlsxas .csv.

Что исправило это для меня, так это «Сохранить как», а затем снова сохранить его как .csv.

Jase
источник
1

Однажды у меня возникла эта проблема, когда в заголовке была одна цитата. Когда я удалил его (т.е. переименовал заголовок соответствующего столбца с Jimmy's dataна Jimmys data), функция не выдала предупреждений.

Loukdelouk
источник
1

Чтобы решить эту проблему с помощью самого R, я просто использовал read.xlsx(..)вместо read.csv(). Работает как шарм !! Вам даже не нужно переименовывать. Переименование xlsx в csv не является жизнеспособным решением.

Дигвиджай Савант
источник
#Digvijay_Sawant, не уверен, что вы имели в виду под своим последним комментарием, но в отличие от всех других решений здесь (я пробовал почти все из них: сводит с ума!), Ваше было единственным, что сработало.
W Barker
1
@WBarker В исходном вопросе автор сохранил Excel в формате CSV, а затем попытался прочитать его. Преобразование Excel в CSV может изменить такие вещи, как форматы данных, может произойти потеря данных и т. Д. Excel может сохранить «конец файла» в формате, отличном от формата CSV, что может затруднить определение функции, где заканчивается файл. Ну, я не эксперт, это просто мысль :-)
Дигвиджай Савант
0

Откройте файл в текстовом обработчике или блокноте ++ и покажите форматирование, например, в текстовом обработчике вы показываете невидимые объекты. Таким образом, вы можете увидеть новую строку или символы табуляции. Часто excel будет добавлять всевозможные табуляции в неправильных местах, а не последний символ новой строки, но вам нужно показать символы, чтобы это увидеть.

препагама
источник
0

Моя работа заключалась в том, что я открыл csvфайл в текстовом редакторе, удалил лишние запятые в последнем значении, а затем сохранил файл. Например, для следующего файла

Test1,Test2,Test3
1,1,1
2,2,2
3,3,3
4,4,
5,5,
,6,,

Удалите запятые после 6 и сохраните файл.

Чейз Райт
источник
0

У меня возникла аналогичная проблема, однако это похоже на общее предупреждение и на самом деле может не быть связано с символом конца строки. В моем случае это выдавало эту ошибку, потому что файл, который я использовал, содержал кириллические символы, как только я заменил их латинскими символами, ошибка исчезла.

Имер Мухович
источник
0

Я пробовал разные решения, такие как использование текстового редактора для вставки новой строки и получения символа конца строки, как рекомендовано в верхнем ответе выше. К сожалению, ничего из этого не сработало.

Решение , которое было , наконец , работать для меня было очень просто: я копировать-вставить содержимое файла CSV в новый файл CSV пустой, сохранить его, и проблема исчезла.

Rens
источник