Numbersで、全角半角を変換する

お客さまより

エクセルで頂いたデータが、全角半角文字が混在している事が多いので

numbersにて変換して使用したいのですが


やり方を教えて下さい

MacBook Pro with Retina display, iOS 7.1.1

投稿日 2014/08/04 22:32

返信
返信: 15

2014/08/20 01:51 sasansyo への返信

度々、失礼致します。 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-Cnilとなった場合

set value of thisCell to newString # セルの値を再設定

end if

end repeat


end tell

end tell


(AppleScript Editor.appの環境設定>一般>『メニューバーにスクリプトメニューを表示』にチェックを入れると、メニューバーの右にアイコンが表示されて、そこから、『Numbers用のスクリプトフォルダーを開く』を実行して表示されるウィンドウに保存しておくと、スクリプトメニューからAppleScriptを実行できるようになります。)


使用方法は、全角文字を含むNumbersのセルを選択(複数可)した状態で、AppleScriptを実行します。 動作がとても早くなるので便利ですよ。  Automatorのサービス(AppleScriptを実行アクション)ではうまく作動しませんでした(原因不明)。


参照URL

2014/08/09 16:49 お子様ランチ. への返信

またはターミナルや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 nkf

2014/08/20 04:10 Hiro__S への返信

Hiro.S 様、


 ご指摘有り難うございます。 その通りでした。 上記の処理では全ての文字を正規化してしまい、必要の無い文字まで変換することになりますね。 もう少し検証した上で書き込むべきでした(お恥ずかしい)。 範囲をしぼって変換できるようにするべきね。 参考のリンクも紹介して頂き、有り難うございます。 


sasansyoさん、


 よろしければ、『お客様』のエクセルのデータで、主に、どのような文字の変換を行う必要があるのかについてお伝え頂けますと助かります。

2014/08/06 01:10 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

2014/08/06 03:28 sasansyo への返信

Numbersはつかったことないけど、ことえりと日本語キーボードなら、文字列をダブルクリックで選択して”かなキー”二度押しで変換するのが簡単だとおもう。



以下は本題からそれますが書いてみたいので書いておきます。

これも使ったこと無いけど、OneDriveに登録してエクセルで関数を使って変換する方法もあるかもしれない。

http://kokodane.com/kan35.htm


他の方法として、ファイルをテキスト化してネット上のサイトを使う方法

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とか使ってできるような予感。

2014/08/20 03:05 T22T への返信

ええと、これだと特定の文字が化けませんか?一応ご確認ください。確認して欲しいのは「示偏の神 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

2014/08/20 06:02 T22T への返信

T22T さん。ご確認ありがとうございます。Numbers では「示偏の神」がちゃんと表示できますね。


ちなみに Safari では HTML に書かれた「示偏の神」はちゃんと表示できますが、フォームにペーストした場合はその瞬間に NFC で正規化され、「ネ偏の神」になります。これでちょっと混乱したのかもしれませんね。


おさらいすると、ユニコード正規化でやる場合は、範囲を絞ってから NFKC、分離した濁点/半濁点は NFC でくっつける...となります。ただ、こればっかりは Perl が一番楽かなと思ったりしてます。

2014/08/20 04:50 Hiro__S への返信

Hiro.S 様、度々、失礼致します。 


「示偏の神 U+FA19」等をNumbers (ver. 3.2 on OS 10.9.2)で試してみました。

すみません、ご指摘の通りでした。示偏の神はネ偏に、丸文字は数字に変換されました(お恥ずかしい)。


何と、全て変換されました!?

どういう仕組みになっているのか、自分で理解していないのですが、びっくりです(下図、画像)

ユーザがアップロードしたファイル

2014/08/20 20:28 T22T への返信

訂正: AutomatorのサービスでもAppleScript/Objective-Cライブラリの利用が可能であることを確認致しました。 引数をテキストに変換する部分が抜けていました(お恥ずかしい)。 文字コードの範囲を制限する処理を加えれば、色々な用途に使えそうです。

ユーザがアップロードしたファイル

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

Numbersで、全角半角を変換する

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。