我有這個文件(http://b7hq6v.alterupload.com/en/),我想用R讀read.csv
。但我無法檢測到正確的編碼。它似乎是一種UTF-8。我在WindowsXP機器上使用R 2.12.1。 任何幫助?如何檢測read.csv的正確編碼?
回答
首先based on more general question on StackOverflow的,不可能檢測在100%的把握文件的編碼。
我已經奮鬥了很多次,來到非自動的解決方案:
使用iconvlist
得到所有可能的編碼:
codepages <- setNames(iconvlist(), iconvlist())
使用他們每個人的
x <- lapply(codepages, function(enc) try(read.table("encoding.asc",
fileEncoding=enc,
nrows=3, header=TRUE, sep="\t"))) # you get lots of errors/warning here
然後讀取數據
重要的是要知道文件的結構(分隔符,頭文件)。使用fileEncoding
參數設置編碼。只讀幾行。
現在,你可以查找成果:
unique(do.call(rbind, sapply(x, dim)))
# [,1] [,2]
# 437 14 2
# CP1200 3 29
# CP12000 0 1
好像正確的是,隨着3行29列,所以讓我們看看他們:
maybe_ok <- sapply(x, function(x) isTRUE(all.equal(dim(x), c(3,29))))
codepages[maybe_ok]
# CP1200 UCS-2LE UTF-16 UTF-16LE UTF16 UTF16LE
# "CP1200" "UCS-2LE" "UTF-16" "UTF-16LE" "UTF16" "UTF16LE"
你可以看看數據太
x[maybe_ok]
對於您的文件,所有此編碼返回相同的數據(部分原因是因爲您看到有一些冗餘)。
如果你不知道具體的文件,你需要使用readLines
與工作流程(例如,您無法使用fileEncoding
,必須使用length
代替dim
,做更多的魔術找到正確的)一些變化。
首先,你必須弄清楚什麼是文件的編碼,什麼不能在R中完成(至少據我所知)。您可以使用外部工具,例如來自Perl,python或eg。 Linux/UNIX下的file
實用程序。
由於@ssmit建議,你有一個UTF-16LE(Unicode)的編碼在這裏,所以這種編碼加載文件,並使用readLines
,看看你在第一(例如)10號線:
> f <- file('encoding.asc', open="r", encoding="UTF-16LE") # UTF-16LE, which is "called" Unicode in Windows
> readLines(f,10)
[1] "\tFe 2\tZn\tO\tC\tSi\tMn\tP\tS\tAl\tN\tCr\tNi\tMo\tCu\tV\tNb 2\tTi\tB\tZr\tCa\tH\tCo\tMg\tPb 2\tW\tCl\tNa 3\tAr"
[2] ""
[3] "0\t0,003128\t3,82E-05\t0,0004196\t0\t0,001869\t0,005836\t0,004463\t0,002861\t0,02148\t0\t0,004768\t0,0003052\t0\t0,0037\t0,0391\t0,06409\t0,1157\t0,004654\t0\t0\t0\t0,00824\t7,63E-05\t0,003891\t0,004501\t0\t0,001335\t0,01175"
[4] "0,0005\t0,003265\t3,05E-05\t0,0003662\t0\t0,001709\t0,005798\t0,004395\t0,002808\t0,02155\t0\t0,004578\t0,0002441\t0\t0,003601\t0,03897\t0,06406\t0,1158\t0,0047\t0\t0\t0\t0,008026\t6,10E-05\t0,003876\t0,004425\t0\t0,001343\t0,01157"
[5] "0,001\t0,003332\t2,54E-05\t0,0003052\t0\t0,001704\t0,005671\t0,0044\t0,002823\t0,02164\t0\t0,004603\t0,0003306\t0\t0,003611\t0,03886\t0,06406\t0,1159\t0,004705\t0\t0\t0\t0,008036\t5,09E-05\t0,003815\t0,004501\t0\t0,001246\t0,01155"
[6] "0,0015\t0,003313\t2,18E-05\t0,0002616\t0\t0,001678\t0,005689\t0,004447\t0,002921\t0,02171\t0\t0,004621\t0,0003488\t0\t0,003597\t0,03889\t0,06404\t0,1158\t0,004752\t0\t0\t0\t0,008022\t4,36E-05\t0,003815\t0,004578\t0\t0,001264\t0,01144"
[7] "0,002\t0,003313\t2,18E-05\t0,0002834\t0\t0,001591\t0,005646\t0,00436\t0,003008\t0,0218\t0\t0,004643\t0,0003488\t0\t0,003619\t0,03895\t0,06383\t0,1159\t0,004752\t0\t0\t0\t0,008\t4,36E-05\t0,003771\t0,004643\t0\t0,001351\t0,01142"
[8] "0,0025\t0,003488\t2,18E-05\t0,000218\t0\t0,001657\t0,00558\t0,004338\t0,002986\t0,02175\t0\t0,004469\t0,0002616\t0\t0,00351\t0,03889\t0,06374\t0,1159\t0,004621\t0\t0\t0\t0,008131\t4,36E-05\t0,003771\t0,004708\t0\t0,001243\t0,01125"
[9] "0,003\t0,003619\t0\t0,0001526\t0\t0,001591\t0,005668\t0,004207\t0,00303\t0,02169\t0\t0,00449\t0,0002834\t0\t0,00351\t0,03874\t0,06383\t0,116\t0,004665\t0\t0\t0\t0,007956\t0\t0,003749\t0,004796\t0\t0,001286\t0,01125"
[10] "0,0035\t0,003422\t0\t4,36E-05\t0\t0,001482\t0,005711\t0,004185\t0,003292\t0,02156\t0\t0,004665\t0,0003488\t0\t0,003553\t0,03852\t0,06391\t0,1158\t0,004708\t0\t0\t0\t0,007717\t0\t0,003597\t0,004905\t0\t0,00133\t0,01136"
由此可以看出,我們在第二行有一個標題和一個空行(默認情況下使用read.table
函數將跳過),分隔符爲\t
,小數字符爲,
。
> f <- file('encoding.asc', open="r", encoding="UTF-16LE")
> df <- read.table(f, sep='\t', dec=',', header=TRUE)
,看看我們有:
> head(df)
X Fe.2 Zn O C Si Mn P S
1 0.0000 0.003128 3.82e-05 0.0004196 0 0.001869 0.005836 0.004463 0.002861
2 0.0005 0.003265 3.05e-05 0.0003662 0 0.001709 0.005798 0.004395 0.002808
3 0.0010 0.003332 2.54e-05 0.0003052 0 0.001704 0.005671 0.004400 0.002823
4 0.0015 0.003313 2.18e-05 0.0002616 0 0.001678 0.005689 0.004447 0.002921
5 0.0020 0.003313 2.18e-05 0.0002834 0 0.001591 0.005646 0.004360 0.003008
6 0.0025 0.003488 2.18e-05 0.0002180 0 0.001657 0.005580 0.004338 0.002986
Al N Cr Ni Mo Cu V Nb.2 Ti B Zr
1 0.02148 0 0.004768 0.0003052 0 0.003700 0.03910 0.06409 0.1157 0.004654 0
2 0.02155 0 0.004578 0.0002441 0 0.003601 0.03897 0.06406 0.1158 0.004700 0
3 0.02164 0 0.004603 0.0003306 0 0.003611 0.03886 0.06406 0.1159 0.004705 0
4 0.02171 0 0.004621 0.0003488 0 0.003597 0.03889 0.06404 0.1158 0.004752 0
5 0.02180 0 0.004643 0.0003488 0 0.003619 0.03895 0.06383 0.1159 0.004752 0
6 0.02175 0 0.004469 0.0002616 0 0.003510 0.03889 0.06374 0.1159 0.004621 0
Ca H Co Mg Pb.2 W Cl Na.3 Ar
1 0 0 0.008240 7.63e-05 0.003891 0.004501 0 0.001335 0.01175
2 0 0 0.008026 6.10e-05 0.003876 0.004425 0 0.001343 0.01157
3 0 0 0.008036 5.09e-05 0.003815 0.004501 0 0.001246 0.01155
4 0 0 0.008022 4.36e-05 0.003815 0.004578 0 0.001264 0.01144
5 0 0 0.008000 4.36e-05 0.003771 0.004643 0 0.001351 0.01142
6 0 0 0.008131 4.36e-05 0.003771 0.004708 0 0.001243 0.01125
謝謝,它的工作原理。但爲什麼我必須跳過前兩行?爲什麼直接在read.csv中沒有這個錯誤? – Alex 2011-01-27 07:29:36
封裝readr
,https://cran.r-project.org/web/packages/readr/readr.pdf,包括一個稱爲guess_encoding
函數,其計算的被編碼的文件的概率在幾個編碼:
guess_encoding("your_file", n_max = 1000)
- 1. [R正確使用read.csv
- 2. 如何確定正確的編碼?
- 3. 在PHP中檢測正確的字符編碼?
- 4. 無法檢測到正確的字符編碼
- 5. 如何測試正確編碼的應用程序(如UTF-8)
- 6. 如何使Eclipse檢測正確的Java源代碼
- 7. 如何在代碼中編寫正確的Cest格式測試?
- 8. 如何檢測文件的編碼?
- 9. 使用UTF-8編碼的read.csv()
- 10. 如何正確的URL編碼口音?
- 11. 如何使用正確編碼的db_dump
- 12. 如何正確編碼JavaScript中的URL?
- 13. 檢查PHP編碼是否正確
- 14. UIButton正確的TouchUp檢測
- 15. 如何檢測字符集編碼?
- 16. HttpWebResponse編碼檢測
- 17. 檢測base64編碼
- 18. 如何在python中正確編碼可能的中文編碼?
- 19. Hang子手代碼不會檢測到正確的猜測
- 20. 如何正確編碼錨點href
- 21. 如何正確反彙編.NET代碼?
- 22. 如何在swift中正確編碼[CLLocation]?
- 23. 如何正確編碼郵件鏈接?
- 24. 檢測程序詢問PIN碼並傳遞正確的代碼
- 25. 如何設置Visual Studio代碼在文件打開時檢測並設置正確的編碼
- 26. XDrawString不正確的編碼
- 27. 正確的字符編碼
- 28. 正確的編碼方式
- 29. array.push的正確編碼
- 30. mySQL不正確的編碼
鏈路是死的。 – Augustin 2016-01-06 15:31:25