คำเตือน 'บรรทัดสุดท้ายไม่สมบูรณ์' เมื่อพยายามอ่านไฟล์. csv เป็น R


114

ฉันพยายามอ่านไฟล์. 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-test หรือเทียบเท่าขึ้นอยู่กับการแจกแจงปกติ / ไม่ใช่การแจกแจงปกติ) ของสองคอลัมน์ในแต่ละครั้งตัวอย่างเช่น t-test ระหว่างค่าคอลัมน์ 1 และค่าคอลัมน์ 2 จากนั้น t- การทดสอบค่าคอลัมน์ 1 และคอลัมน์ 3 เป็นต้น

ความช่วยเหลือหรือข้อเสนอแนะใด ๆ จะได้รับการชื่นชมอย่างจริงจัง!


1
@ Kate: คุณช่วยเชื่อมโยงเรากับไฟล์ตัวเองได้ไหม? ฉันมีความคิดบางอย่าง แต่ยากที่จะบอกว่าปัญหาคืออะไรโดยไม่ต้องมีไฟล์
Joris Meys

สวัสดี Joris - ฉันไม่แน่ใจว่าจะทำอย่างไรขอโทษ ...
Kate

คอลัมน์แรกมีค่า 1045 ค่าที่สองมี 623 ค่าและคอลัมน์ที่สามมี 871 หากช่วยได้ ... ? ค่าตัวเลขทั้งหมดเป็นตัวเลขครึ่งตัวคือ 23, 24.5 เป็นต้น ...
Kate

1
ฉันคิดว่านั่นเป็นปัญหาเพราะ read.table ทำให้ข้อมูลของคุณอยู่ใน data frame ซึ่งต้องมีความยาวของคอลัมน์เท่ากัน
Sir Ksilem

1
@ เจมส์: ไม่มันไม่ใช่ readTableHead (ฟังก์ชัน c พื้นฐาน) อ่าน 5 บรรทัดแรก ข้อผิดพลาดเกิดขึ้นที่นั่น
Joris Meys

คำตอบ:


134

ข้อความระบุว่าบรรทัดสุดท้ายของไฟล์ไม่ได้ลงท้ายด้วยอักขระ End Of Line (EOL) (linefeed ( \n) หรือ carriage return + linefeed ( \r\n)) ความตั้งใจเดิมของข้อความนี้คือเพื่อเตือนคุณว่าไฟล์อาจไม่สมบูรณ์ ดาต้าไฟล์ส่วนใหญ่มีอักขระ EOL เป็นอักขระสุดท้ายในไฟล์

วิธีการรักษานั้นง่ายมาก:

  1. เปิดไฟล์
  2. ไปที่บรรทัดสุดท้ายของไฟล์
  3. วางเคอร์เซอร์ไว้ที่ท้ายบรรทัดนั้น
  4. กด return
  5. บันทึกไฟล์

2
ไม่ใช่บรรทัดสุดท้ายของไฟล์ มันคือส่วนหัวที่เขากำลังอ่านซึ่งเป็นห้าบรรทัดแรกของคุณ
Joris Meys

@JorisMeys อย่างไรก็ตามข้อความแสดงข้อผิดพลาดอ้างถึงบรรทัดสุดท้ายของไฟล์ การทำตามขั้นตอนข้างต้นจะลบคำเตือนออกไป
WorldGov

@WorldGov "บรรทัดสุดท้ายไม่สมบูรณ์" คือคำเตือน (ไม่ใช่ข้อผิดพลาด) ที่อาจปรากฏขึ้นเนื่องจากสาเหตุที่แตกต่างกัน ในกรณีของคุณนั่นคือการขาด EOL ขั้นสุดท้าย ไม่มีทางที่ในกรณีของคุณคำเตือนถูกส่งโดยฟังก์ชัน readTableHeader เนื่องจากคำเตือนนั้นไม่อ่านบรรทัดสุดท้าย ดังนั้นปัญหาของคุณจึงไม่เหมือนกับของ OP
Joris Meys

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 ในขณะที่มันไม่ใช่

สิ่งต่อไปที่คุณควรทำคือเปิดไฟล์ใน Notepad หรือ 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 หาก Kate ดูไฟล์ที่คัดลอกไปยังเดสก์ท็อปหรือภายในโฟลเดอร์ไอคอนของไฟล์. csv จะมี "a" อยู่ในขณะที่ไฟล์. xlsx มีไอคอนที่ดูมากกว่า เหมือนแผ่นงาน นี่เป็นวิธีที่มองเห็นได้อย่างรวดเร็วในการกำหนดประเภทไฟล์ ดูง่ายกว่ามากเมื่อบันทึกลงบนเดสก์ท็อปเนื่องจากไอคอนมีขนาดใหญ่ขึ้น :)
Michelle

7

ใช้readLines()(กับwarn = FALSE) เพื่ออ่านไฟล์เป็นเวกเตอร์อักขระก่อน

หลังจากนั้นใช้text =ตัวเลือกเพื่ออ่านเวกเตอร์ลงในกรอบข้อมูลด้วยread.table()

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

3

ฉันตระหนักว่ามีการให้คำตอบหลายข้อ แต่ยังไม่มีการแก้ไขที่แท้จริง

สาเหตุตามที่กล่าวไว้ข้างต้นคือ "End of line" หายไปที่ท้ายไฟล์ CSV

ในขณะที่การแก้ไขจริงควรมาจาก Microsoft การดำเนินการคือการเปิดไฟล์ CSV ด้วยโปรแกรมแก้ไขข้อความและเพิ่มบรรทัดที่ส่วนท้ายของไฟล์ (หรือที่เรียกว่ากดปุ่ม return) ฉันใช้ซอฟต์แวร์ ATOM เป็นตัวแก้ไขข้อความ / โค้ด แต่โปรแกรมแก้ไขข้อความพื้นฐานแทบทั้งหมดจะทำ

ในระหว่างนี้โปรดรายงานข้อบกพร่องไปยัง Microsoft

คำถาม: สำหรับฉันแล้วดูเหมือนว่าจะเป็นปัญหา office 2016 ใครมีปัญหาบนพีซีหรือไม่?


2

ฉันได้รับข้อความเดียวกัน รวมการแก้ไขของฉัน: ฉันลบแผ่นงานเพิ่มเติมทั้งหมด (แท็บ) ในไฟล์. csv กำจัดอักขระที่ไม่ใช่ตัวเลขบันทึกไฟล์ใหม่เป็นตัวคั่นด้วยจุลภาคและโหลดใน R v 2.15.0 โดยใช้ภาษามาตรฐาน:

ชื่อไฟล์ <-read.csv ( "ชื่อไฟล์" หัว = TRUE)

เพื่อเป็นการป้องกันเพิ่มเติมฉันปิดซอฟต์แวร์และเปิดขึ้นมาใหม่ก่อนที่จะโหลด csv


2

ในภาษายุโรปต่าง ๆ เนื่องจากอักขระลูกน้ำทำหน้าที่เป็นจุดทศนิยมควรใช้ฟังก์ชัน read.csv2 แทน


2

ฉันได้แก้ไขปัญหานี้ด้วยการเปลี่ยนการเข้ารหัสในอาร์กิวเมนต์ read.table จาก fileEncoding = "UTF-16" เป็น fileEncoding = "UTF-8"


1

ปัญหาที่คุณกำลังอธิบายเกิดขึ้นกับฉันเมื่อฉันเปลี่ยนชื่อ.xlsxเป็น.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 ซึ่งอาจทำให้ฟังก์ชันยากที่จะระบุว่าไฟล์สิ้นสุดที่ใด ฉันไม่ใช่ผู้เชี่ยวชาญ แต่เป็นแค่ความคิด :-)
Digvijay Sawant

0

เปิดไฟล์ใน text wrangler หรือ notepad ++ และแสดงการจัดรูปแบบเช่นใน text wrangler ที่คุณแสดงล่องหน ด้วยวิธีนี้คุณจะเห็นอักขระบรรทัดหรือแท็บใหม่บ่อยครั้ง excel จะเพิ่มแท็บทุกประเภทในตำแหน่งที่ไม่ถูกต้องและไม่ใช่อักขระบรรทัดใหม่สุดท้าย แต่คุณต้องแสดงสัญลักษณ์เพื่อดูสิ่งนี้


0

วิธีแก้ปัญหาของฉันคือฉันเปิดcsvไฟล์ในโปรแกรมแก้ไขข้อความลบเครื่องหมายจุลภาคที่มากเกินไปในค่าสุดท้ายจากนั้นบันทึกไฟล์ ตัวอย่างเช่นสำหรับไฟล์ต่อไปนี้

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

ลบเครื่องหมายจุลภาคหลัง 6 จากนั้นบันทึกไฟล์


0

ฉันประสบปัญหาที่คล้ายกัน แต่ดูเหมือนจะเป็นคำเตือนทั่วไปและอาจไม่เกี่ยวข้องกับอักขระบรรทัดสุดท้าย ในกรณีของฉันมันให้ข้อผิดพลาดนี้เนื่องจากไฟล์ที่ฉันใช้มีอักขระซิริลลิกเมื่อฉันแทนที่ด้วยอักขระละตินข้อผิดพลาดจะหายไป


0

ฉันลองใช้วิธีแก้ปัญหาต่างๆเช่นใช้โปรแกรมแก้ไขข้อความเพื่อแทรกบรรทัดใหม่และรับอักขระ End Of Lineตามที่แนะนำในคำตอบด้านบน สิ่งเหล่านี้ไม่ได้ผลน่าเสียดาย

วิธีการแก้ปัญหาที่ไม่ได้ทำงานในที่สุดสำหรับฉันคือง่ายมาก: ฉันจะคัดลอกวางเนื้อหาของไฟล์ CSV เป็นไฟล์ CSV ว่างเปล่าใหม่บันทึกไว้และปัญหาก็หายไป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.