首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定用于read.fwf的正确文件编码(或使用变通方法删除不符合标准的字符)

如何确定用于read.fwf的正确文件编码(或使用变通方法删除不符合标准的字符)
EN

Stack Overflow用户
提问于 2012-11-21 23:04:28
回答 1查看 1.9K关注 0票数 2

我在下面的问题中尝试了这种方法,但仍然卡住了。

How to detect the right encoding for read.csv?

下面的代码应该是可重现的。有什么想法吗?我不想使用scan()或readLines,因为在过去,我已经成功地将此代码用于各种状态级别的ACS数据……

我的另一个想法是在导入文本文件之前对其进行编辑。但是,我存储压缩后的文件,并使用脚本解压,然后访问数据。如果必须在R环境之外编辑文件,那么这个过程就会变得很糟糕。提前感谢!

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-22 06:51:41

首先,我们首先识别所有非ASCII字符。为此,我将转换为一个原始向量,然后查找大于127的值(ASCII格式的最后一个明确编码的值)。

代码语言:javascript
复制
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):

代码语言:javascript
复制
iconv(lines[bad], "latin1", "utf-8")

最后,我们使用正确的编码重新加载。令人困惑的是,任何read.*函数的编码参数都不能做到这一点-您需要在连接上手动指定编码:

代码语言:javascript
复制
fixed <- readLines(file("g20095us.txt", encoding = "latin1"))
fixed[bad]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13496059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档