我在下面的问题中尝试了这种方法,但仍然卡住了。
How to detect the right encoding for read.csv?
下面的代码应该是可重现的。有什么想法吗?我不想使用scan()或readLines,因为在过去,我已经成功地将此代码用于各种状态级别的ACS数据……
我的另一个想法是在导入文本文件之前对其进行编辑。但是,我存储压缩后的文件,并使用脚本解压,然后访问数据。如果必须在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)下面是文件"g2009us.txt“中的四行。第二个"Canoncito“导致了问题。下载中的其他文件是csv,但这个文件是固定宽度的,对于识别感兴趣的地理位置是必要的(数据的组织不是很直观)。
US251000000964 2430 090 25100US2430090卡梅隆章,纳瓦霍民族保留地和非保留地信托土地,AZ--NM--UT ACSSF US251000000965 2430 092 25100US2430092 Cañoncito分会,纳瓦霍民族保留地和非保留地信托土地,AZ--NM--UT ACSSF US251000000966 2430 095 25100US2430095卡萨梅罗湖分会,纳瓦霍民族保留区和非保留区信托土地,AZ--NM--UT ACSSF US251000000967 2430 105 25100US2430105奇利塔章,纳瓦霍族保留地和非保留地托管地,AZ--NM--UT
发布于 2012-11-22 06:51:41
首先,我们首先识别所有非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]然后我们需要找出正确的编码是什么。当我们只有两个案例时,这是具有挑战性的,并且经常涉及一些试验和错误。在这种情况下,我在谷歌上搜索“编码\xf1",发现了Why doesn't this conversion to utf8 work?,这表明latin1可能是corect编码。
我使用iconv进行了测试,它可以从一种编码转换为另一种编码(您总是希望使用utf-8):
iconv(lines[bad], "latin1", "utf-8")最后,我们使用正确的编码重新加载。令人困惑的是,任何read.*函数的编码参数都不能做到这一点-您需要在连接上手动指定编码:
fixed <- readLines(file("g20095us.txt", encoding = "latin1"))
fixed[bad]https://stackoverflow.com/questions/13496059
复制相似问题