2017-01-17 4 views
0

大きな文字列の文字を修正しようとしています。文字は<U\\+[0-9a-fA-F]{4}>(例:S<U+00E3>)のように見えます。これは358,626の長さのベクトルで、私は以下の100個の値のランダムサンプルを提供します。大きなベクトルの文字を修正しました

期待される結果は:

"Thessalon<U+00ED>ki Thessaloniki Greece" => "Thessaloníki Thessaloniki Greece" 
"Phoenix Arizona United States" => "Phoenix Arizona United States" 
"" => "" 
NA => NA 

幸いにも、@MrFlickは「通常」の文字に戻ってそれらを変換するためのtrueunicodeと呼ばれる素敵な機能を考案しました。しかし、パターンを含まない文字列の場合、trueunicodeは失敗します。私はそうのように、パターンをcontaing値のみにtrueunicodeを適用することによって、この問題を回避しようとしました:

sapply(addresses, function(x) ifelse(grepl("<U\\+[0-9a-fA-F]{4}>", x)), trueunicode(x), x)) 

残念ながら、いくつかの理由で、trueunicodeはまだ戻って、どこかで失敗します。

エラーに(機能(CP):あまりにも多くのビット

addresses <- c("San Francisco California United States", "Encinitas CA United States", 
"Malvern Pennsylvania United States", "New York NY United States", 
"Temecula CA United States", "San Francisco CA United States", 
"Pittsburgh Pennsylvania United States", "Istanbul Turkey", "Rochester New York United States", 
"Atlanta GA United States", "Cochin Kerala India", "Sydney New South Wales Australia", 
"Los Angeles CA United States", "Vancouver British Columbia Canada", 
"Rio De Janeiro Rio de Janeiro Brazil", "Washington District of Columbia United States", 
"Seattle Washington United States", "Phoenix Arizona United States", 
"Kwun Tong Kowloon Hong Kong", "Milwaukee Wisconsin United States", 
"Dublin Dublin Ireland", "London England United Kingdom", "Broomfield Colorado United States", 
"Bandung Indonesia", "London England United Kingdom", "Washington United States", 
"Ramat Gan Tel Aviv Israel", "Sydney New South Wales Australia", 
"Houston TX United States", "Salida CO United States", "Bethesda Maryland United States", 
"San Jose California United States", "S<U+00E3>o Gon<U+00E7>alo Rio de Janeiro Brazil", 
"Richmond Virginia United States", "Davao City Davao City Philippines", 
"Bucharest Bucuresti Romania", "Providencia Chile", "Cape Coral Florida United States", 
"Glenrothes Fife United Kingdom", "New York New York United States", 
"Brooklyn NY United States", "New York New York United States", 
"Vienna Wien Austria", "Addison TX United States", "Tel Aviv Tel Aviv Israel", 
"Hilton New York United States", "Tiangu<U+00E1> Ceara Brazil", 
"Hamburg Hamburg Germany", "Thessalon<U+00ED>ki Thessaloniki Greece", 
"New York New York United States", "Vancouver British Columbia Canada", 
"Lagos Lagos Nigeria", "Karachi Sindh Pakistan", "Santa Barbara CA United States", 
"Mumbai Maharashtra India", "Burlington Massachusetts United States", 
"Oslo Oslo Norway", "Jakarta Jakarta Raya Indonesia", "Madrid Madrid Spain", 
"Singapore", "San Mateo California United States", "St. Petersburg Florida United States", 
"Cincinnati Ohio United States", "San Francisco CA United States", 
"Gaithersburg Maryland United States", "Watford Hertford United Kingdom", 
"Austin Texas United States", "Gent Oost-Vlaanderen Belgium", 
"Canton Massachusetts United States", "Berkeley California United States", 
"Carlsbad California United States", "St. Petersburg Florida United States", 
"Bangalore Karnataka India", "Nyon Vaud Switzerland", "Arlington Virginia United States", 
"Palo Alto California United States", "London England United Kingdom", 
"Sydney New South Wales Australia", "Mumbai Maharashtra India", 
"Austin Texas United States", "Larnaca Cyprus", "Melbourn Cambridgeshire United Kingdom", 
"Chicago Illinois United States", "Houston Texas United States", 
"Paris France", "New York New York United States", "Auburn Hills Michigan United States", 
"New Delhi Delhi India", "Bangalore Karnataka India", "Redwood City California United States", 
"Mississauga Ontario Canada", "New York New York United States", 
"Sydney New South Wales Australia", "St Louis MO United States", 
"Rotterdam The Netherlands", "Delta British Columbia Canada", 
"Erlangen Bayern Germany", "Ashburn Virginia United States", 
"Pasadena California United States", "Palo Alto CA United States" 
) 

EDIT:私はPanagiotisKanavosさんのコメント@以下、Unicodeのエラーの言及を削除しました

+0

これらはUnicodeエラーではなく、単純旧ASCII文字です。 ''は8個のASCII文字、 '<'、 'U'、' + '、' 0'、 '0'、' E'、 '3'、'> 'の文字列です。あなたのデータソースはおそらくこのエンコーディングスキームを使用して、山括弧、 'U +'とUnicodeコードポイントを使ってASCIIとして表現できないものを格納します。テキストを実際のUnicodeテキストとしてエクスポートするか、使用されたエンコーディングの種類を調べてそれを逆転させてください。 –

+0

実際、このエンコーディングはUnicodeとまったく関係ありません。例えば、サロニカのギリシャの都市はギリシア語でΘεσσαλονίκηと呼ばれています。しかし、あなたのテキストには「Thessalon ki」が含まれています。 '00ED'はラテン文字 'í'です。 –

+0

'trueunicode'を見ると、この関数は、Windows、100%Unicode OSがどうにかしてUnicodeに問題があるという完全に間違った仮定を使ってUnicodeを壊すようです。現実には、Unicodeを一貫して処理しないRです。Unicodeはwchar文字列として、その他のメソッドは普通のcharとして扱われ、ANSIとUTF8を区別するためにシステムのロケールに依存します。現在、C++標準でさえUTF8固有の文字列はありませんが、UTF16とUTF32の型はあります。 Wcharを使用しないか、コードページを明示的に指定できるRパッケージは、UTF16を読み取ることができません。 –

答えて

0

ベクトルではなく、一度に1つの値を呼び出してジョブを実行しました。

for (x in 1:length(addresses)) { 
y <- addresses[x] 
addresses[x] <- ifelse(grepl("<U\\+[0-9a-fA-F]{4}>", y), trueunicode(y), y) 
} 

ただし、これは明確な解決策よりも回避策です。さらに、私は結果に奇妙な点があることを知りました。パターン"<U\\+[0-9a-fA-F]{4}>"は、RStudioのデータフレーム "view"では引き続き表示されますが、これはgreplによって検出されなくなりました。

関連する問題