2

次の質問のアプローチを試しましたが、まだ行き詰まっています。

read.csv の正しいエンコーディングを検出するには?

この次のコードは再現可能でなければなりません...何かアイデアはありますか? 過去にさまざまな状態レベルの ACS データに対してこのコードを正常に使用してきたため、scan() または readLines は使用したくありません。

もう 1 つの考えは、テキスト ファイルをインポートする前に編集することです。ただし、ファイルを圧縮して保存し、スクリプトを使用して解凍し、データにアクセスします。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」からの4行。2 番目の「Canoncito」が問題を引き起こしています。ダウンロード内の他のファイルは csv ですが、これは固定幅で、関心のある地域を識別するために必要です (データの構成はあまり直感的ではありません)。

ACSSF US251000000964 2430 090 25100US2430090 Cameron Chapter, Navajo Nation Reservation and Off-Reservation Trust Land, AZ--NM--UT ACSSF US25100000965 2430 092 25100US2430092 Cañoncito Chapter, Navajo Nation Reservation and Off-Reservation AZ NM Land-servation UT NM ACSSF US251000000966 2430 095 25100US2430095 カサメロ湖支部、Navajo Nation Reservation and Off-Reservation Trust Land, AZ--NM--UT ACSSF US251000000967 2430 105 25100US2430105 Chi Chil Tah Chapter, Navajo Nation Reservation and Off-Reservation Trust Land, AZ--NM--UT

4

1 に答える 1

8

まず、すべての非 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]

次に、正しいエンコーディングが何であるかを理解する必要があります。2 つのケースしかない場合、これは困難であり、試行錯誤が必要になることがよくあります。この場合、「encoding \xf1」をググっ てみたところ、utf8 への変換がうまくいかない理由がわかりました。これは、latin1 が正しいエンコーディングである可能性があることを示唆しています。

iconvwhich を使用して、あるエンコーディングから別のエンコーディングに変換することをテストしました (そして、常に utf-8 を使用する必要があります)。

iconv(lines[bad], "latin1", "utf-8")

最後に、正しいエンコーディングでリロードします。紛らわしいことに、どの関数の encoding 引数もこれをread.*行いません - 接続でエンコーディングを手動で指定する必要があります:

fixed <- readLines(file("g20095us.txt", encoding = "latin1"))
fixed[bad]
于 2012-11-21T22:51:40.817 に答える