Mic*_*ams 2 r character-encoding
我在下面的问题中尝试了这种方法,但仍然卡住了.
以下代码应该是可重现的...任何想法?我宁愿不使用scan()或readLines,因为我过去一直在成功使用此代码来处理各种状态级别的ACS数据....
我的另一个想法是在导入之前编辑文本文件.但是,我将文件存储为zipped并使用脚本解压缩然后访问数据.必须在R环境之外编辑文件才会真正搞砸了这个过程.提前致谢!
Filename <- "g20095us.txt"
Url <- "http://www2.census.gov/acs2005_2009_5yr/summaryfile/2005-2009_ACSSF_By_State_By_Sequence_Table_Subset/UnitedStates/All_Geographies_Not_Tracts_Block_Groups/"
Widths <- c(6,2,3,2,7,1,1,1,2,2,3,5,5,6,1,5,4,5,1,3,5,5,5,3,5,1,1,5,3,5,5,5,2,3,
3,6,3,5,5,5,5,5,1,1,6,5,5,40,200,6,1,50)
Classes <- c(rep('character',4),'integer',rep('character',47))
Names <- c('fileid','stusab','sumlev','geocomp','logrecno','us','region','division',
'statece','state','county','cousub','place','tract','blkgrp','concit',
rep('blank',14),'ua',rep('blank',11),'ur',rep('blank',4),'geoid','name',rep('blank',3))
GeoHeader <- read.fwf(paste0(Url,Filename),widths=Widths,
colClasses=Classes,col.names=Names,fill=TRUE,strip.white=TRUE)
Run Code Online (Sandbox Code Playgroud)
下面的文件"g2009us.txt"中的四行.第二个"Canoncito"造成了问题.下载中的其他文件是csv,但是这个文件是固定宽度的,并且是识别感兴趣的地理位置所必需的(数据的组织不是非常直观).
ACSSF US251000000964 2430 090 25100US2430090 Cameron Chapter,Navajo Nation Reservation and Off-Reservation Trust Land,AZ - NM - UT ACSSF US251000000965 2430 09225100US2430092CañoncitoChapter,Navajo Nation Reservation and Off-Reservation Trust Land,AZ - NM - UT ACSSF US251000000966 2430 095 25100US2430095 Casamero Lake Chapter,纳瓦霍国家保留和非预订信托土地,亚利桑那州 - 新墨西哥州 - 美国证券交易所代码US251000000967 2430 105 25100US2430105 Chi Chil Tah章,纳瓦霍国家预订和非预订信托基地,亚利桑那州 - 新墨西哥州 - UT
首先,我们首先确定所有非ASCII字符.我这样做是通过将转换转换为原始向量,然后查找超过127的值(ASCII中最后一个明确编码的值).
lines <- readLines("g20095us.txt")
non_ascii <- function(x) {
any(charToRaw(x) > 127)
}
bad <- vapply(lines, non_ascii, logical(1), USE.NAMES = FALSE)
lines[bad]
Run Code Online (Sandbox Code Playgroud)
然后我们需要弄清楚正确的编码是什么.当我们只有两个案例时,这很有挑战性,并且经常涉及一些反复试验.在这种情况下,我用googled"encoding\xf1",并发现 为什么这个转换为utf8不起作用?,这表明latin1可能是核心编码.
我测试了使用iconv哪种编码转换为另一种编码(你总是想使用utf-8):
iconv(lines[bad], "latin1", "utf-8")
Run Code Online (Sandbox Code Playgroud)
最后,我们使用正确的编码重新加载.令人困惑的是,任何read.*函数的编码参数都不会这样做 - 您需要在连接上手动指定编码:
fixed <- readLines(file("g20095us.txt", encoding = "latin1"))
fixed[bad]
Run Code Online (Sandbox Code Playgroud)