web-dev-qa-db-ja.com

データファイルから非ASCII文字を削除する

Rに読み込んで.rdata形式のパッケージ/データフォルダーに含めるcsvファイルがたくさんあります。残念ながら、データ内の非ASCII文字はチェックに失敗します。 toolsパッケージには、非ASCII文字(showNonASCIIshowNonASCIIfile)をチェックする2つの関数がありますが、それらを削除/クリーニングするための1つを見つけることができないようです。

他のUNIXツールを調べる前に、これをすべてRで実行して、生データから最終製品までの完全なワークフローを維持できるようにすることをお勧めします。非ASCII文字を取り除くのに役立つ既存のパッケージ/関数はありますか?

68
Maiasaura

単純に削除非ASCII文字にするには、ベースRのiconv()を使用し、sub = ""。このような何かが動作するはずです:

x <- c("Ekstr\xf8m", "J\xf6reskog", "bi\xdfchen Z\xfcrcher") # e.g. from ?iconv
Encoding(x) <- "latin1"  # (just to make sure)
x
# [1] "Ekstrøm"         "Jöreskog"        "bißchen Zürcher"

iconv(x, "latin1", "ASCII", sub="")
# [1] "Ekstrm"        "Jreskog"       "bichen Zrcher"

locate ASCII以外の文字を使用したり、ファイル内に文字列が含まれているかどうかを確認したりするには、次のアイデアを採用する可能性があります。

## Do *any* lines contain non-ASCII characters? 
any(grepl("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII")))
[1] TRUE

## Find which lines (e.g. read in by readLines()) contain non-ASCII characters
grep("I_WAS_NOT_ASCII", iconv(x, "latin1", "ASCII", sub="I_WAS_NOT_ASCII"))
[1] 1 2 3
76
Josh O'Brien

最近では、一般的なユニコード変換のための機能を提供するstringiパッケージを使用するのが少し良いアプローチです。これにより、元のテキストを可能な限り保存できます。

x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher")
x
#> [1] "Ekstrøm"         "Jöreskog"        "bißchen Zürcher"

stringi::stri_trans_general(x, "latin-ascii")
#> [1] "Ekstrom"          "Joreskog"         "bisschen Zurcher"
72
hadley

ASCII以外の文字を含むすべての単語を削除するには(@Hadleyからコードを借りる)、xfunからfilterのパッケージdplyrを使用できます。

x <- c("Ekstr\u00f8m", "J\u00f6reskog", "bi\u00dfchen Z\u00fcrcher", "alex")
x

x %>% 
  tibble(name = .) %>%
  filter(xfun::is_ascii(name)== T)
0
Nick