Ostrzeżenie „Niekompletna ostatnia linia” podczas próby odczytania pliku .csv do R

114

Próbuję odczytać plik .csv do R i przy użyciu tej formuły:

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

Otrzymuję ten komunikat ostrzegawczy:

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

Jest kilka rzeczy, które moim zdaniem mogły spowodować to ostrzeżenie, ale niestety nie wiem wystarczająco dużo o R, aby samodzielnie zdiagnozować problem, więc pomyślałem, że opublikuję tutaj w nadziei, że ktoś inny zdiagnozuje to za mnie!

  • plik .csv był pierwotnie plikiem programu Excel, który zapisałem w formacie .csv
  • plik zawiera trzy kolumny danych
  • każda kolumna danych ma różną długość, tj. w każdej kolumnie znajduje się inna liczba wartości
  • Chcę porównać średnie (przy użyciu testu t lub równoważnego w zależności od rozkładu normalnego / nienormalnego) dwóch kolumn naraz, więc na przykład test t między wartościami z kolumny 1 i wartościami z kolumny 2, a następnie t- test wartości z kolumny 1 i kolumny 3 itp.

Każda pomoc lub sugestie byłyby bardzo mile widziane!

Kate
źródło
1
@Kate: czy możesz połączyć nas z samym plikiem? Mam kilka pomysłów, ale bez pliku trudno powiedzieć, jaki to problem.
Joris Meys
Cześć Joris - Nie jestem pewien, jak to zrobić, przepraszam ...
Kate
Pierwsza kolumna zawiera 1045 wartości, druga 623 wartości, a trzecia 871, jeśli to pomoże ...? Wszystkie są wartościami liczbowymi w liczbach całkowitych i półliczbowych, tj. 23, 24,5 itd ...
Kate
1
Myślę, że na tym polega problem, ponieważ read.table umieszcza dane w ramce danych, która musi mieć równe długości kolumn.
Sir Ksilem
1
@James: Nie, nie jest. readTableHead (podstawowa funkcja c) odczytuje pierwsze 5 wierszy. Stamtąd pochodzi błąd.
Joris Meys

Odpowiedzi:

134

Komunikat wskazuje, że ostatni wiersz pliku nie kończy się znakiem końca wiersza (EOL) (znak końca wiersza ( \n) lub powrót karetki + znak końca wiersza ( \r\n)). Pierwotnym zamiarem tej wiadomości było ostrzeżenie, że plik może być niekompletny; większość plików danych ma znak EOL jako ostatni znak w pliku.

Rozwiązanie jest proste:

  1. Otwórz plik
  2. Przejdź do ostatniej linii pliku
  3. Umieść kursor na końcu tej linii
  4. naciśnij return
  5. Zapisz plik
Hendrik Pon
źródło
2
To nie jest ostatnia linia pliku. To nagłówek, który czyta, czyli Twoje pierwsze pięć linijek.
Joris Meys
@JorisMeys Komunikat o błędzie odnosi się jednak do ostatniej linii pliku. Wykonanie powyższych czynności rzeczywiście usuwa ostrzeżenie.
WorldGov
@WorldGov „niekompletna ostatnia linia” to ostrzeżenie (nie błąd), które może pojawić się z różnych przyczyn. W twoim przypadku jest to brak końcowego EOL. Nie ma mowy, żeby w twoim przypadku ostrzeżenie zostało wyrzucone przez funkcję readTableHeader, ponieważ ta nie czyta ostatniej linii. Dlatego twój problem nie jest taki sam jak w przypadku PO.
Joris Meys
20

Problem jest łatwy do rozwiązania; to dlatego, że ostatnia linia MUSI być pusta.

Powiedz, jeśli Twoja treść jest

line 1,
line2

zmień to na

line 1,
line2
(empty line here)

Dzisiaj spotkałem się z tego rodzaju problemem, gdy próbowałem użyć R do odczytania pliku JSON, używając poniższej komendy:

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

; i rozwiązuję to moją powyższą metodą.

Vincent Jia
źródło
1
używając hydraulika do hostowania R API miałem ten sam problem. Warning message: In readLines(file) : incomplete final line found on 'apiAnaheim.R'ostrzeżenie zostało rozwiązane przez dodanie na końcu jednej pustej linii. Nie wiem, dlaczego tak się dzieje.
HoofarLotusX
To samo tutaj. Dzięki.
Megadeth,
14

Czy naprawdę jesteś pewien, że wybrałeś plik .csv, a nie plik .xls? Mogę odtworzyć błąd tylko wtedy, gdy spróbuję odczytać plik .xls. Jeśli spróbuję czytać w pliku .csv lub innym pliku tekstowym, niemożliwe jest odtworzenie otrzymanego błędu.

> 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'

readTableHeadjest funkcją c, która daje błąd. Próbuje odczytać w pierwszych n wierszach (standardowo pierwsze 5), aby określić typ danych. Reszta danych jest wczytywana za pomocą scan(). Więc problemem jest format pliku.

Jednym ze sposobów sprawdzenia tego jest ustawienie katalogu roboczego na katalog, w którym znajduje się plik. W ten sposób zobaczysz rozszerzenie czytanego pliku. Wiem, że w systemie Windows nie jest wyświetlane w standardzie, więc możesz uwierzyć, że jest to plik csv, a nie jest.

Następną rzeczą, którą powinieneś zrobić, to otworzyć plik w Notatniku lub Wordpadzie (lub innym edytorze) i sprawdzić, czy format jest równoważny z moim plikiem test.csv:

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

Ten plik zawiera następującą ramkę danych:

> 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

Format csv zapisany w programie Excel oddziela wszystkie komórki przecinkiem. Puste komórki po prostu nie mają wartości. read.table()może z łatwością sobie z tym poradzić i dobrze rozpoznaje puste komórki.

Joris Meys
źródło
Zakładając, że jest to środowisko Windows 7, jeśli Kate patrzy na plik skopiowany na pulpit lub do folderu, ikona pliku .csv ma ​​„a”, podczas gdy plik .xlsx ma ikonę, która wygląda bardziej jak arkusz roboczy. Jest to szybki wizualny sposób określania typu pliku. Znacznie łatwiejsze do zobaczenia po zapisaniu na pulpicie, ponieważ ikony są większe. :)
Michelle
7

Użyj readLines()(z warn = FALSE), aby najpierw wczytać plik do wektora znakowego.

Następnie użyj text =opcji, aby wczytać wektor do ramki danych za pomocąread.table()

    pheasant <- read.table( 
        text = readLines(file.choose(), warn = FALSE), 
        header = TRUE,  
        sep = "," 
    )
Damian
źródło
3

Zdałem sobie sprawę, że udzielono kilku odpowiedzi, ale nie ma jeszcze prawdziwej poprawki.

Powodem, jak wspomniano powyżej, jest brak „końca wiersza” na końcu pliku CSV.

Podczas gdy prawdziwa poprawka powinna pochodzić od firmy Microsoft, obejście polega na otwarciu pliku CSV za pomocą edytora tekstu i dodaniu linii na końcu pliku (czyli naciśnięciu klawisza powrotu). Używam oprogramowania ATOM jako edytora tekstu / kodu, ale praktycznie każdy podstawowy edytor tekstu powinien działać.

W międzyczasie zgłoś błąd do firmy Microsoft.

Pytanie: Wydaje mi się, że jest to problem w biurze 2016. Czy ktoś ma problem na komputerze?

Nicolas Stifani
źródło
2

Otrzymałem tę samą wiadomość. Moja poprawka obejmowała: usunąłem wszystkie dodatkowe arkusze (zakładki) w pliku .csv, wyeliminowałem znaki nienumeryczne, ponownie zapisałem plik jako rozdzielany przecinkami i załadowałem do wersji R v 2.15.0 przy użyciu standardowego języka:

filename <-read.csv ("filename", header = TRUE)

Jako dodatkowe zabezpieczenie zamknąłem oprogramowanie i uruchomiłem je ponownie przed załadowaniem pliku csv.

erik
źródło
2

W różnych lokalizacjach europejskich, ponieważ przecinek służy jako przecinek dziesiętny, należy zamiast tego użyć funkcji read.csv2.

yifan
źródło
2

Rozwiązałem ten problem, zmieniając kodowanie w argumencie read.table z fileEncoding = "UTF-16" na fileEncoding = "UTF-8".

Dejan Pljevljakusic
źródło
1

Problem, który opisujesz, wystąpił u mnie, kiedy zmieniłem nazwę na .xlsxas .csv.

Rozwiązaniem tego problemu było wybranie opcji „Zapisz jako”, a następnie .csvponowne zapisanie jako .

Jase
źródło
1

Mam ten problem raz, kiedy miałem pojedynczy cytat jako część nagłówka. Kiedy go usunąłem (tj. Zmieniłem nazwę odpowiedniego nagłówka kolumny z Jimmy's datana Jimmys data), funkcja nie zwróciła żadnych ostrzeżeń.

loukdelouk
źródło
1

Aby rozwiązać ten problem za pomocą samego R, po prostu użyłem read.xlsx(..)zamiast pliku read.csv(). Działa jak marzenie!! Nie musisz nawet zmieniać nazwy. Zmiana nazwy xlsx na csv nie jest dobrym rozwiązaniem.

Digvijay Sawant
źródło
#Digvijay_Sawant, nie jestem pewien, co masz na myśli, mówiąc o swoim ostatnim komentarzu, ale w przeciwieństwie do każdego innego rozwiązania tutaj (wypróbowałem prawie wszystkie z nich: szalenie!), Twoje było jedynym, które działało.
W Barker
1
@WBarker W pierwotnym pytaniu autor zapisał Excel w pliku csv, a następnie próbował go przeczytać. Cóż, konwersja Excela do CSV może zmienić takie rzeczy jak formaty danych, może nastąpić utrata danych itp. Excel może przechowywać „koniec pliku” w innym formacie niż csv, co może utrudniać ustalenie, gdzie kończy się plik. Cóż, nie jestem ekspertem, tylko myśl :-)
Digvijay Sawant
0

Otwórz plik w edytorze tekstu lub notatniku ++ i pokaż formatowanie, np. W edytorze tekstu, który robisz, pokazujesz niewidoczne. W ten sposób możesz zobaczyć znaki nowej linii lub tabulatorów Często program Excel dodaje wszelkiego rodzaju tabulatory w niewłaściwych miejscach, a nie ostatni znak nowej linii, ale aby to zobaczyć, musisz pokazać symbole.

prepagam
źródło
0

Moje obejście polegało na tym, że otworzyłem csvplik w edytorze tekstu, usunąłem nadmiarowe przecinki z ostatniej wartości, a następnie zapisałem plik. Na przykład dla następującego pliku

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

Usuń przecinki po 6, a następnie zapisz plik.

Ścigaj Wrighta
źródło
0

Doświadczyłem podobnego problemu, jednak wydaje się to ogólnym ostrzeżeniem i może w rzeczywistości nie być związane ze znakiem końca linii. W moim przypadku dawał ten błąd, ponieważ plik, którego używałem, zawierał znaki cyrylicy, po zastąpieniu ich znakami łacińskimi błąd zniknął.

Imer Muhović
źródło
0

Wypróbowałem różne rozwiązania, takie jak użycie edytora tekstu, aby wstawić nowy wiersz i uzyskać znak końca wiersza, zgodnie z zaleceniami w górnej odpowiedzi powyżej. Niestety żaden z nich nie zadziałał.

Rozwiązanie, które ostatecznie nie działa dla mnie było bardzo proste: kopiować, wklejać zawartość pliku CSV do nowego pliku CSV puste, zapisany, a problem zniknął.

Rens
źródło