2014-10-10 20 views
5

Tôi đang sử dụng R 3.1.1 trên Windows 7 32bits. Tôi đang gặp rất nhiều vấn đề khi đọc một số tệp văn bản mà tôi muốn thực hiện phân tích văn bản. Theo Notepad ++, các tệp được mã hóa với "UCS-2 Little Endian". (grepWin, một công cụ có tên nói lên tất cả, cho biết tệp là "Unicode".)R: không thể đọc các tệp văn bản unicode ngay cả khi chỉ định mã hóa

Vấn đề là tôi không thể đọc tệp ngay cả khi chỉ định mã hóa đó. (Các nhân vật được các tiêu chuẩn Tây Ban Nha thiết lập -ñáó- Latinh và cần được xử lý một cách dễ dàng với CP1252 hoặc bất cứ điều gì như thế.)

> Sys.getlocale() 
[1] "LC_COLLATE=Spanish_Spain.1252;LC_CTYPE=Spanish_Spain.1252;LC_MONETARY=Spanish_Spain.1252;LC_NUMERIC=C;LC_TIME=Spanish_Spain.1252" 
> readLines("filename.txt") 
[1] "ÿþE" "" "" "" "" ... 
> readLines("filename.txt",encoding="UTF-8") 
[1] "\xff\xfeE" ""   ""   ""   "" ... 
> readLines("filename.txt",encoding="UCS2LE") 
[1] "ÿþE" "" "" "" "" "" ""  ... 
> readLines("filename.txt",encoding="UCS2") 
[1] "ÿþE" "" "" "" "" ... 

Bất kỳ ý tưởng?

Cảm ơn !!


chỉnh sửa là: "UTF-16", "UTF-16LE" và "UTF-16BE" encondings thất bại tương tự

+0

' '\ xff \ xfe'' là' UTF-16LE' mã hóa của nhãn thứ tự byte (BOM) tính cách. Giải mã với UTF-8 sẽ thất bại vì FFh là một byte bắt đầu không hợp lệ, nhưng tôi không quen thuộc với R. –

+1

Tôi đã có những cuộc đấu tranh tương tự với mã hóa. Đã thành công hơn với 'scan' hơn là tôi đã đọc' readLines'. Hãy thử 'scan (" filename.txt ", fileEncoding =" UCS-2LE ", sep =" \ n ")' –

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ tôi nên báo cáo lỗi này, đúng không? 'scan' không đọc tệp (và tôi không hiểu sự khác biệt giữa thông số' fileEncoding' và 'encoding'), nhưng nó tạo ra các sự cố khác. Đầu tiên, nó chỉ mất "một dấu phân cách byte", và nếu bạn sử dụng một dấu phân cách vô lý nó rơi trở lại không gian như một sep. Ngoài ra, nó dải \ r \ n mà tôi cần phải bảo tồn. Và cuối cùng, vì một số lý do 'paste' không ghép nối chuỗi (nó chỉ trả về vectơ gốc). –

Trả lời

7

Sau khi đọc chặt chẽ hơn đối với các tài liệu, tôi thấy câu trả lời cho câu hỏi của tôi.

Thông số encoding của readLines chỉ áp dụng cho chuỗi đầu vào param. Tài liệu hướng dẫn cho biết:

mã hóa được giả định cho chuỗi đầu vào. Nó được sử dụng để đánh dấu các ký tự ký tự được biết là bằng tiếng Latin-1 hoặc UTF-8: nó không được sử dụng để mã hóa lại đầu vào. Để thực hiện việc sau, hãy chỉ định mã hóa như một phần của con kết nối hoặc thông qua các tùy chọn (encoding =): xem các ví dụ. Xem cũng ‘Chi tiết’.

Cách đúng đắn của việc đọc một tập tin với một mã hóa phổ biến là, sau đó,

filetext <- readLines(con <- file("UnicodeFile.txt", encoding = "UCS-2LE")) 
close(con) 
+2

Cảm ơn điều này đã làm việc cho tôi. Tôi đã sử dụng: 'hht9aa <- read.csv (tệp (" hht9aa_aa.txt ", mã hóa =" UCS-2LE "))' Và cuối cùng đã đọc chính xác các tệp UTF-16 Little Endian. Nhưng tôi không phải đóng cửa (con), thực ra tôi đã gặp lỗi khi tôi làm như vậy, và cuối cùng bỏ nó ra. –

Các vấn đề liên quan