web-dev-qa-db-ja.com

Rで「不明」から「UTF-8」への文字ベクトルエンコーディングを強制する

Rで文字ベクトルの一貫性のないエンコードに問題があります。

テーブルを読み込んだテキストファイルは、(_Notepad++_を介して)_UTF-8_でエンコードされています(_UTF-8 without BOM_も試しました)。

このテキストファイルからテーブルを読み取り、それを_data.table_に変換し、keyを設定して、バイナリ検索を利用したいと思います。私がそうしようとしたとき、次のようになりました:

警告メッセージ:_[.data.table_(poli.dt、 "żżonymi"、mult = "first")で:既知のエンコード(latin1またはUTF-8)が結合列で検出されました。 data.tableは現在バイトを比較しているため、mixedエンコードをサポートしていません。つまり、latin1とUTF-8の両方を使用している場合、または不明なエンコードが非ASCIIであり、それらの一部が既知とマークされていて、他はそうでない場合です。しかし、latin1またはUTF-8のいずれかが排他的に使用され、未知のエンコーディングがすべてASCIIである場合、結果は問題ないはずです。将来的にはチェックして、すべてが問題なければこの警告を回避します。難しい部分は、ASCIIのみの場合のパフォーマンスに影響を与えずにこれを行うことです。

およびバイナリ検索動作しません

_data.table_-key列は、「不明」と「UTF-8」エンコーディングタイプの両方で構成されていることに気付きました。

_> table(Encoding(poli.dt$Word))
unknown   UTF-8 
2061312 2739122 
_

私はこの列を(_data.table_オブジェクトを作成する前に)変換しようとしました:

  • Encoding(Word) <- "UTF-8"
  • Word<- enc2utf8(Word)

しかし、効果はありません。

また、ファイルをRに読み込むいくつかの異なる方法を試しました(すべての有用なパラメーターを設定します(例:_encoding = "UTF-8"_)):

  • _data.table::fread_
  • _utils::read.table_
  • _base::scan_
  • _colbycol::cbc.read.table_

しかし、効果はありません。

==================================================

私のR.version:

_> R.version
           _                           
platform       x86_64-w64-mingw32          
Arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          3                           
minor          0.3                         
year           2014                        
month          03                          
day            06                          
svn rev        65126                       
language       R                           
version.string R version 3.0.3 (2014-03-06)
nickname       Warm Puppy  
_

私のセッション情報:

_> sessionInfo()
R version 3.0.3 (2014-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=Polish_Poland.1250  LC_CTYPE=Polish_Poland.1250                LC_MONETARY=Polish_Poland.1250
[4] LC_NUMERIC=C                   LC_TIME=Polish_Poland.1250    

base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2 colbycol_0.8     filehash_2.2-2   rJava_0.9-6     

loaded via a namespace (and not attached):
[1] plyr_1.8.1     Rcpp_0.11.1    reshape2_1.2.2 stringr_0.6.2  tools_3.0.3   
_
44
Marta Karas

Encoding関数は、文字列に「ネイティブエンコーディング」マーク(場合によってはCP-1250)がある場合、またはASCIIである場合、unknownを返します。これら2つのケースを区別するには、以下を呼び出します。

library(stringi)
stri_enc_mark(poli.dt$Word)

各文字列が有効なUTF-8バイトシーケンスであるかどうかを確認するには、次を呼び出します。

all(stri_enc_isutf8(poli.dt$Word))

そうでない場合、ファイルは間違いなくUTF-8ではありません。

データ読み取り関数でUTF-8モードを強制していないと思われます(poli.dt$Wordの内容を調べて、このステートメントを確認してください)。私の推測が正しい場合、試してください:

read.csv2(file("filename", encoding="UTF-8"))

または

poli.dt$Word <- stri_encode(poli.dt$Word, "", "UTF-8") # re-mark encodings

data.tableがまだ「混合」エンコーディングについて文句を言っている場合、非ASCII文字を音訳することをお勧めします。例:

stri_trans_general("Zażółć gęślą jaźń", "Latin-ASCII")
## [1] "Zazolc gesla jazn"
46
gagolews

私自身も同様の問題の解決策を見つけることができませんでした。 txtファイルの未知のエンコーディング文字をRで管理しやすいものに変換できませんでした。

したがって、同じデータセットで同じ文字が複数回表示される状況にありました。これは、異なる文字コード(ラテン語設定では「X」、ギリシャ語設定では「X」)であるためです。ただし、txtの保存操作では、そのエンコードの違いが保持されました。もちろん、よくできています。

上記の方法のいくつかを試しても、何も機能しませんでした。この問題はよく説明されています 「ASCII UTF-8と区別できず、設定してもビットが固執しません」

適切な回避策は "data.frameをCSV一時ファイルにエクスポートし、data.table :: fread()で再インポートし、ソースエンコーディングとしてLatin-1を指定します。" です。

上記のソースから与えられた例を再現/コピー:

package(data.table)
df <- your_data_frame_with_mixed_utf8_or_latin1_and_unknown_str_fields
fwrite(df,"temp.csv")
your_clean_data_table <- fread("temp.csv",encoding = "Latin-1")

私はそれが誰かを助けることを願っています。

6