29

OEM-866 (キリル文字セット) としてエンコードされた CSV を Windows の R にインポートしようとしています。BOMなしでUTF-8に変換されたコピーもあります。これらのファイルは両方とも、エンコーディングを指定すると、システム上の他のすべてのアプリケーションで読み取ることができます。

さらに、Linux では、R は指定されたエンコーディングでこれらの特定のファイルを問題なく読み取ることができます。「fileEncoding」パラメーターを指定しない場合、Windows で CSV を読み取ることもできますが、テキストが読み取れなくなります。Windows でファイル エンコーディングを指定すると、OEM ファイルと Unicode ファイルの両方で常に次のエラーが発生します。

元の OEM ファイルのインポート:

> oem.csv <- read.table("~/csv1.csv", sep=";", dec=",", quote="",fileEncoding="cp866")   #result:  failure to import all rows
Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  invalid input found on input connection '~/Revolution/RProject1/csv1.csv'
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  number of items read is not a multiple of the number of columns

BOM ファイルのインポートなしの UTF-8:

> unicode.csv <- read.table("~/csv1a.csv", sep=";", dec=",", quote="",fileEncoding="UTF-8") #result:    failure to import all row
Warning messages:
1: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  invalid input found on input connection '~/Revolution/RProject1/csv1a.csv'
2: In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
  number of items read is not a multiple of the number of columns

ロケール情報:

> Sys.getlocale()
   [1] "LC_COLLATE=English_United States.1252;LC_CTYPE=English_United States.1252;LC_MONETARY=English_United States.1252;LC_NUMERIC=C;LC_TIME=English_United States.1252"

これに責任があるのは、Windows上のRについて何ですか? この時点で、ウィンドウを捨てる以外に、できることはほとんどすべて試しました。

ありがとうございました

(追加の試行失敗):

>Sys.setlocale("LC_ALL", "en_US.UTF-8") #OS reports request to set locale to "en_US.UTF-8" cannot be honored
>options(encoding="UTF-8") #now nothing can be imported  
> noarg.unicode.csv <- read.table("~/Revolution/RProject1/csv1a.csv", sep=";", dec=",", quote="")   #result: mangled cyrillic
> encarg.unicode.csv <- read.table("~/Revolution/RProject1/csv1a.csv", sep=";", dec=",", quote="",encoding="UTF-8") #result: mangled cyrillic
4

5 に答える 5

8

fileEncoding を encoding に変更することで問題が解決する可能性があります。これらのパラメーターは読み取り関数で異なる働きをします (?read を参照)。

oem.csv <- read.table("~/csv1.csv", sep=";", dec=",", quote="",encoding="cp866")

ただし、明らかでない障害がいくつかある可能性があるため、念のため、より完全な回答を提供します。要するに、Windows(私の場合はWin 7)のRでキリル文字を扱うことができます。

動作させるには、いくつかの可能なエンコーディングを試す必要があるかもしれません。テキスト マイニングの重要な側面は、入力変数をデータと一致させることです。Encoding() の関数は非常に便利です。iconv() も参照してください。したがって、ネイティブ パラメータを確認することができます。

Encoding(variant <- "Минемум")

私の場合、エンコーディングは UTF-8 ですが、これはシステム設定に依存する場合があります。したがって、UTF-8 と UTF-8-BOM で結果を試し、ラテン語の行とキリル文字の行を含む notepad++ でテスト ファイルを作成できます。

UTF8_nobom_cyrillic.csv & UTF8_bom_cyrillic.csv

part2, part3, part4
Минемум конкыптам, тхэопхражтуз, ед про

これはRにインポートできます

raw_table1 <- read.csv("UTF8_nobom_cyrillic.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8")
raw_table2 <- read.csv("UTF8_bom_cyrillic.csv", header = FALSE, sep = ",", quote = "\"", dec = ".", fill = TRUE, comment.char = "", encoding = "UTF-8-BOM")

これらの結果は、ビュー (raw_table1) では BOM 通常のキリル文字であり、コンソールでは意味不明です。

part2, part3, part4
ŠŠøŠ½ŠµŠ¼Ńм конкыптам Ń‚Ń…Ń¨Š¾ŠæŃ…Ń€Š°Š¶Ń‚ŃŠ

ただし、さらに重要なことは、スクリプトがアクセスを許可しないことです。

> grep("Минемум", as.character(raw_table2[2,1]))
integer(0)

No BOM UTF-8 の結果は、ビュー (raw_table1) とコンソールの両方で次のようになります。

part2, part3, part4
<U+041C><U+0438><U+043D><U+0435><U+043C><U+0443><U+043C> <U+043A><U+043E><U+043D><U+043A><U+044B><U+043F><U+0442><U+0430><U+043C> <U+0442><U+0445><U+044D><U+043E><U+043F><U+0445><U+0440><U+0430><U+0436><U+0442><U+0443><U+0437> <U+0435><U+0434> <U+043F><U+0440><U+043E>

ただし、重要なのは、内部の単語を検索すると正しい結果が得られることです。

> grep("Минемум", as.character(raw_table1[2,1]))
1

したがって、正確な目標に応じて、Windows で非標準の文字を操作することは可能です。私は英語以外のラテン文字を定期的に使用しており、UTF-8 により Windows 7 で問題なく作業できます。「WINDOWS-1252」は、Excel などの Microsoft リーダーへのエクスポートに役立ちました。

PSロシア語はここで生成されましたhttp://generator.lorem-ipsum.info/_russian、本質的に無意味です。PPS あなたが言及した警告は、明らかな重要な影響がないまま残っています。

于 2015-02-11T18:19:07.773 に答える
7

簡単な答え。

Sys.setlocale(locale = "Russian")

ロシア語だけが必要な場合(フォーマット、通貨ではありません):

'Sys.setlocale(category = "LC_COLLATE", locale = "Russian")'

'Sys.setlocale(category = "LC_CTYPE", locale = "Russian")'

Revolution R Open 3.2.2 を使用している場合は、コントロール パネルでもロケールを設定する必要がある場合があります。そうしないと、RStudio を使用している場合、ビューアにキリル文字が表示され、コンソールにゴミが表示されます。たとえば、ランダムなキリル文字列を入力して Enter キーを押すと、ガベージ出力が表示されます。興味深いことに、Revolution R にはアラビア語のテキストと同じ問題はありません。通常の R を使用する場合Sys.setlocale()は、それで十分と思われます。

'Sys.setlocale()' はユーザー G. Grothendieck によって提案されました: R、Windows、および外国語の文字

于 2015-12-13T21:13:22.023 に答える
6

現在のロケールでサポートされていない文字を含むファイルからデータを読み取るには、2 つのオプションがあります。@ user23676 の提案に従ってロケールを変更するか、UTF-8 に変換することができます。パッケージは、この変換を実行する派生関数のreadr代替を提供します。read.tableCP866ファイルを読むことができます

library(readr)
oem.csv <- read_csv2('~/csv1.csv', locale = locale(encoding = 'CP866'))

1 つ小さな問題があります。これは、print.data.frameWindows で UTF-8 エンコーディングの列が正しく表示されないバグがあることです。print.listof(oem.csv)またはでバグを回避できますprint(as.matrix(oem.csv))

これについては、 http://people.fas.harvard.edu/~izahn/posts/reading-data-with-non-native-encoding-in-r/のブログ投稿で詳しく説明しました。

于 2016-06-19T00:16:20.800 に答える