Numbersで、全角半角を変換する
お客さまより
エクセルで頂いたデータが、全角半角文字が混在している事が多いので
numbersにて変換して使用したいのですが
やり方を教えて下さい
MacBook Pro with Retina display, iOS 7.1.1
お客さまより
エクセルで頂いたデータが、全角半角文字が混在している事が多いので
numbersにて変換して使用したいのですが
やり方を教えて下さい
MacBook Pro with Retina display, iOS 7.1.1
度々、失礼致します。 AppleScript/Objective-CライブラリやUnicodeについて学んでいたところ、Objective-CのNSStringクラスに、precomposedStringWithCompatibilityMappingというプロパティがあることがわかりました。 これはUnicodeのNormalization Form KCを利用して全角文字を半角文字に変換した文字列を返す様です。 なので、AppleScript/Objective-Cライブラリを作成することでAppleScriptからこのプロパティの機能を活用できるようです。
手順としては、
1)AppleScript/Objective-Cライブラリ(ASOC Library)の作成
AppleScript Editor.appの新規作成書類に、以下のステートメントを記入して、Script bundle形式で書類を ~/Library/Script Librariesフォルダ(新たにフォルダを作成)に保存します。 保存した書類を開き、ウィンドウの右上にある、Bundle Contentsアイコンを押して、『AppleScript/Objective-C Library』にチェックを入れて、再度保存します。
use framework "Foundation"
on nomalizationFormKC(someText)
set theString to current application'sNSMutableString'sstringWithString:someText
set adjustedString to theString'sprecomposedStringWithCompatibilityMapping()
return adjustedString as text
end nomalizationFormKC
2)AppleScriptの作成
AppleScript Editor.appの新規作成書類に、以下のステートメントを記入して、保存します。
use theLib : script "NSString Properties" # ASOCスクリプトライブラリを参照
tell front document of application "Numbers"
tell active sheet
set theTable to first table whose class of selection range is range # アクティブな表を取得
set theCellList to cells of selection range of theTable # 選択しているセルをリスト化
repeat with thisCell in theCellList # セル毎に繰り返し
set theString to (value of thisCell) as text # セルの値を取得
set newString to theLib'snomalizationFormKC(theString) # ASOCスクリプトライブラリのハンドラーを使用
if newString is not "missing value" then # Objective-Cでnilとなった場合
set value of thisCell to newString # セルの値を再設定
end if
end repeat
end tell
end tell
(AppleScript Editor.appの環境設定>一般>『メニューバーにスクリプトメニューを表示』にチェックを入れると、メニューバーの右にアイコンが表示されて、そこから、『Numbers用のスクリプトフォルダーを開く』を実行して表示されるウィンドウに保存しておくと、スクリプトメニューからAppleScriptを実行できるようになります。)
使用方法は、全角文字を含むNumbersのセルを選択(複数可)した状態で、AppleScriptを実行します。 動作がとても早くなるので便利ですよ。 Automatorのサービス(AppleScriptを実行アクション)ではうまく作動しませんでした(原因不明)。
参照URL
またはターミナルやrudyとか使えるならnkfhttp://docs.ruby-lang.org/ja/2.1.0/class/NKF.htmlとか使ってできるような予感。
Re: Re: Re: Automatorでファイル名を全角→半角にできますか?
https://discussionsjapan.apple.com/message/100853582#100853582
↑リンク先のものがそのまま使えます。T22T さんの AppleScript に組み込むと良いでしょう。
on run
set s01 to "ゔぁいおりん ヴァイオリン ヴァイオリン ABC123 ABC123"
set s02 to "!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~´—‘’“”−〈〉 ¥"
set str to (s01 & return & s02)
my normalize(str)
end run
on normalize(str)
__省略__
end normalizeちなみに Ruby に組み込まれている NKF だとこんな感じ。記号の変換が Perl 版とはちょっと違います。両者を同じにすることもできますが、面倒なのでそのままにしておきます。
on run
set s01 to "ゔぁいおりん ヴァイオリン ヴァイオリン ABC123 ABC123"
set s02 to "!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~´—‘’“”−〈〉 ¥"
set str to (s01 & return & s02)
my nkf("-wZ", str)
end run
on nkf(opt, str)
set sh1 to "printf '%s' " & quoted form of str & " | "
set sh2 to "ruby -r nkf -Ku -ne 'print NKF.nkf(%q{" & opt & "}, $_)'"
--
do shell script (sh1 & sh2)
end nkfHiro.S 様、
ご指摘有り難うございます。 その通りでした。 上記の処理では全ての文字を正規化してしまい、必要の無い文字まで変換することになりますね。 もう少し検証した上で書き込むべきでした(お恥ずかしい)。 範囲をしぼって変換できるようにするべきね。 参考のリンクも紹介して頂き、有り難うございます。
sasansyoさん、
よろしければ、『お客様』のエクセルのデータで、主に、どのような文字の変換を行う必要があるのかについてお伝え頂けますと助かります。
度々、失礼致します。 試しに全角の数字を半角に変換するAppleScriptを作ってみました(Numbers ver. 3.2)。 変換するセルを選択した状態で実行します。 (注:動作は遅いです)
tell front document of application "Numbers"
tell active sheet
set theTable to first table whose class of selection range is range # アクティブな表を取得
set theCellList to cells of selection range of theTable # 選択しているセルをリスト化
repeat with thisCell in theCellList # セル毎に繰り返し
set theString to (value of thisCell) as text # セルの値を取得
set newString to my fullToHalfWideth(theString) # ハンドラーへ
set value of thisCell to newString# セルの値を再設定
end repeat
end tell
end tell
-- テキスト中の全角数字を半角数字に変換するハンドラー
on fullToHalfWideth(sourceText)
set the comparisonCharacters to "1234567890"
set the sourceCharacters to "1234567890"
set the newText to ""
repeat with thisCharacter in sourceText
set x to the offsetofthisCharacterin the comparisonCharacters
if x is not 0 then
set the newText to ¬
(the newText & character x of the sourceCharacters) as string
else
set the newText to (the newText & thisCharacter) as string
end if
end repeat
return the newText
end fullToHalfWideth
参照URL: http://macosxautomation.com/mavericks/libraries/simple.html
Numbersはつかったことないけど、ことえりと日本語キーボードなら、文字列をダブルクリックで選択して”かなキー”二度押しで変換するのが簡単だとおもう。
以下は本題からそれますが書いてみたいので書いておきます。
これも使ったこと無いけど、OneDriveに登録してエクセルで関数を使って変換する方法もあるかもしれない。
他の方法として、ファイルをテキスト化してネット上のサイトを使う方法
http://zerothree.sub.jp/php/mbckana/
http://zerothree.sub.jp/php/mbckana_b/
難しいとなるとプログラミングは全く門外漢ですが、検索ではjava scriptとかのhttp://logicalerror.seesaa.net/article/275434211.htmlアルゴリズムを勉強するとできそう。
またはターミナルやrudyとか使えるならnkfhttp://docs.ruby-lang.org/ja/2.1.0/class/NKF.htmlとか使ってできるような予感。
ええと、これだと特定の文字が化けませんか?一応ご確認ください。確認して欲しいのは「示偏の神 U+FA19」。「ネ編の神 U+795E」に化けると思います (仕様の問題)。あと、丸数字は数字になるはず (NFKC の仕様)。
なお、「示偏の神 U+FA19」はスクリプト以前に Numbers で正しく表示できない可能性もあります。Snow Leopard 環境では Safari のフォームとか Terminal での表示が NFC で正規化されるので、すべて「ネ編の神 U+795E」に文字化けします。その辺も併せてご確認いただければと。
ユニコード正規化には仕様上の問題がありまして、無条件に正規化すると文字化けしてしまいます。また、NFKC NFKD では丸数字が通常の数字になったりするので、範囲を絞ってから適用すべきかと思います。
ご参考
Unicode正規化とは
http://homepage1.nifty.com/nomenclator/unicode/normalization.htm
T22T さん。ご確認ありがとうございます。Numbers では「示偏の神」がちゃんと表示できますね。
ちなみに Safari では HTML に書かれた「示偏の神」はちゃんと表示できますが、フォームにペーストした場合はその瞬間に NFC で正規化され、「ネ偏の神」になります。これでちょっと混乱したのかもしれませんね。
おさらいすると、ユニコード正規化でやる場合は、範囲を絞ってから NFKC、分離した濁点/半濁点は NFC でくっつける...となります。ただ、こればっかりは Perl が一番楽かなと思ったりしてます。
失礼致します。数字の変換であれば、テキストの検索と置き換えを0から9まで10回行えば全て変換できるのではないでしょうか?
訂正(すみません):スペルを間違っていました Wideth > Width(お恥ずかしい)
追記: NFC でくっつけるときも範囲を絞る必要があります。そうしないと、「示偏の神」が「ネ偏の神」になってしまいます。
有難うございます。とても参考になります。PerlとUnicodeの正規化についてきちんと理解しておくべきでした。
ASOC のコードを目にすることはあまりないので勉強になります。ありがとうございます。
Numbersで、全角半角を変換する