Предупреждение "Неполная последняя строка" при попытке прочитать файл .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 = "," 
    )

3

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

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

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

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

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


2

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

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

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


2

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



1

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

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


1

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


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 пустой, сохранить его, и проблема исчезла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.