2012-07-06 41 views
7

Tôi có một nhóm tên tác giả từ nước ngoài trong một CSV mà R đọc chỉ là tốt. Tôi đang cố gắng để làm sạch chúng để tải lên cơ Turk (mà thực sự không giống như ngay cả một nhân vật quốc tế duy nhất). Bằng cách đó, tôi có một câu hỏi (được đăng sau), nhưng tôi có thể thậm chí không dput chúng một cách hợp lý:Cách xử lý văn bản quốc tế hóa đúng cách?

> dput(df[306,"primauthfirstname"]) 
"Gwena\xeblle M" 
> test <- "Gwena\xeblle M" 
<simpleError in nchar(val): invalid multibyte string 1> 

Nói cách khác, dput công trình tốt, nhưng dán kết quả trong thất bại . Tại sao không dput xuất thông tin cần thiết để cho phép sao chép/dán lại vào R (có lẽ tất cả những gì cần làm là thêm thuộc tính mã hóa vào một câu lệnh cấu trúc?). Làm cách nào để tôi làm như vậy?

Lưu ý rằng \xeb là một nhân vật có giá trị như xa như R là có liên quan:

> gsub("\xeb","", turk.df[306,"primauthfirstname"]) 
[1] "Gwenalle M" 

Nhưng mà bạn không thể đánh giá các nhân vật riêng biệt - đó là mã hex \ x ## hoặc không có gì:

> gsub("\\x","", turk.df[306,"primauthfirstname"]) 
[1] "Gwena\xeblle M" 
+3

Điều này làm việc tốt cho tôi: '(kiểm tra <-" Gwena \ xeblle M ")' sản lượng '[1]" Gwenaëlle M "'. Tôi đang sử dụng R 2.14.0 với 'LANG = en_US.UTF-8'. –

+0

@MichaelHoffman Mảnh 'LANG' là gì? Làm cách nào để kiểm tra? –

+0

Đó là biến môi trường. Hãy thử 'Sys.getenv (" LANG ")'. Bạn đang sử dụng phiên bản R nào? –

Trả lời

1

dput() của helppage nói: "Viết một văn bản ASCII đại diện của một đối tượng R". Vì vậy, nếu đối tượng của bạn chứa các ký tự không phải ASCII, chúng không thể được biểu diễn và phải được chuyển đổi bằng cách nào đó.

Vì vậy, tôi khuyên bạn nên sử dụng iconv() để chuyển đổi véc tơ của bạn trước dput ing. Một cách tiếp cận là:

> test <- "Gwena\xeblle M" 
> out <- iconv(test, from="latin1", to="ASCII", sub="byte") 
> out 
[1] "Gwena<eb>lle M" 
> gsub('<eb>', 'ë', out) 
[1] "Gwenaëlle M" 

như bạn thấy, hoạt động theo cả hai cách. Sau đó, bạn có thể sử dụng gsub() để chuyển đổi lại byte thành ký tự (nếu mã hóa của bạn hỗ trợ nó, ví dụ: utf-8).

Cách tiếp cận thứ hai là đơn giản hơn (và tôi đoán thích hợp hơn cho nhu cầu của bạn), nhưng hoạt động một chiều và libiconv của bạn có thể không hỗ trợ nó:

> test <- "Gwena\xeblle M" 
> iconv(test, from="latin1", to="ASCII//TRANSLIT") 
[1] "Gwenaelle M" 

Hope this helps!

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