1. 程式人生 > >R語言讀寫中文編碼方式

R語言讀寫中文編碼方式

    R語言讀寫資料的方法很多,這裡主要是我在使用read.csv/read.table和write.csv/write.table時遇到的一些中文格式編碼的問題。常見的中文編碼方式兩種:GBK(GB2312)和UTF-8。

    Windows系統下:

    read.csv()和read.table()方法不指定檔案格式時,預設讀取的檔案是GBK格式。Rstudio裡面有設定預設文字編碼方式,但是修改前後讀入中文資料情況都一樣。

    

   Linux(我使用的Redhat)系統下:

   系統指定中文編碼方式是UTF-8,所以read.csv()和read.table()都要求UTF-8。

    如下兩個檔案,分別是UTF-8格式和GBK格式,首先用read.csv讀取,可以看到不指定編碼方式時,讀取UTF-8格式檔案是亂碼。用encoding指定讀取的檔案編碼方式為UTF-8後,正常。這樣看起來read.csv()方法讀取UTF-8好像可行?


    那麼我們再來看一個例子,相同的資料,只是最後多增加一列中文。同樣,上面三種方式,讀取UTF-8的時候問題直接變成了讀取出錯,“列的數目比列的名字要多”,並且制定編碼方式為UTF-8也無法拯救你了。為什麼會這樣呢?



    提示意思是,列名少了,那就去掉表頭header=F就行了,結果如下,還是亂碼,並且原本四列資料讀進來後變成了七列。雖然指定encoding為UTF-8後沒有了亂碼,但是讀取時行之間會錯亂。但是用fileEncoding就沒有問題了!

    上述,總結而言,使用read.csv()時,有中文的話,請務必保證你的檔案是GBK編碼格式的。或者用fileEncoding來指定編碼格式,不要用encoding!

    用同樣的資料來看read.table方法,只是需要多指定一個sep=”,”。同樣,指定encoding無效,指定fileEncoding有效。

    跟read.csv一樣的問題,並且,這裡header=F也可行。read.table比read.csv更嚴格,要求行都有相同的長度,不會自動填充NA。

    write.csv/write.table方法可以使用,可以使用fileEncoding來指定輸出檔案的編碼方式,如下,只要你的系統能識別這種方式就OK。


    其實囉囉嗦嗦了這麼久,總結而言就一句話read.csv/read.table儘量讀入檔案GBK格式(Win下),或者UTF-8格式(Linux下),不是的話,用fileEncoding指定編碼格式,不要用encoding。