指定のCSVファイルを読み込んで、表インタフェースで表示確認するAppleScriptです。
Numbers.appから文字コードにUTF-8を指定して書き出したCSVファイルを想定しています。CSVデータのparseにはBridgePlusを、表UIの表示にはMyriad Tables Libを利用しています。
ほぼ、テンプレートともいえるような定型処理ですが、巨大なAppleScriptに入れたときにはusing terms from句がないとアプレットとして動作中にクラッシュが発生する可能性があります。
CSVデータの処理はありふれたありきたりの内容で、本来は処理内容にはほとんど関係ない表示・確認を行わせるとユーザーの反応がいいようです。
あとは、CSVデータ中にカラムヘッダーが存在するかどうかをCSVデータからでは検出できないことが問題です。せめて、メタデータ中にでもカラムヘッダーの有無を(Export時に)書いておいてくれるとよいのですが。あとは、CSV1行目のデータと他の行との文字コードの分布状況を比較して統計処理すると、相関性を数値化してヘッダーかどうかを計算できそうですが、、、そこまでやるのは「やりすぎ」でしょう。
ユーザーにヘッダーの有無を確認するとか、そのぐらい?
_kMDItemOwnerUserID = 504 kMDItemAlternateNames = ( "2010_index.csv" ) kMDItemContentCreationDate = 2018-08-14 00:51:24 +0000 kMDItemContentModificationDate = 2018-08-14 00:51:24 +0000 kMDItemContentType = "public.comma-separated-values-text" kMDItemContentTypeTree = ( "public.comma-separated-values-text", "public.data", "public.delimited-values-text", "public.plain-text", "public.item", "public.content", "public.text" ) kMDItemDateAdded = 2018-08-14 00:51:24 +0000 kMDItemDisplayName = "2010_index" kMDItemFSContentChangeDate = 2018-08-14 00:51:24 +0000 kMDItemFSCreationDate = 2018-08-14 00:51:24 +0000 kMDItemFSCreatorCode = "" kMDItemFSFinderFlags = 16 kMDItemFSHasCustomIcon = (null) kMDItemFSInvisible = 0 kMDItemFSIsExtensionHidden = 1 kMDItemFSIsStationery = (null) kMDItemFSLabel = 0 kMDItemFSName = "2010_index.csv" kMDItemFSNodeCount = (null) kMDItemFSOwnerGroupID = 80 kMDItemFSOwnerUserID = 504 kMDItemFSSize = 7746 kMDItemFSTypeCode = "" kMDItemKind = "Comma Separated Spreadsheet (.csv)" kMDItemLogicalSize = 7746 kMDItemPhysicalSize = 8192 kMDItemUserCreatedDate = ( "2018-08-14 00:51:24 +0000" ) kMDItemUserCreatedUserHandle = ( 504 )
▲ここ(メタデータ)にCSVのヘッダーの有無の情報が入っているといいのに、、、、にしても、メタデータに大昔のResource Forkよろしくいろんなデータが突っ込まれるようになってきました
▲CSVファイルの選択
▲CSVファイル内容の表示
▲CSV内のカラム数が合っていた場合の動作
▲CSV内のカラム数が合っていない場合の動作(データ確認表示)
▲CSV内のカラム数が合っていない場合の動作(ダイアログ表示)
AppleScript名:CSVデータを読み込んで表インタフェースで表示確認 v2.scptd |
— – Created by: Takaaki Naganoya – Created on: 2018/08/10 — – Copyright © 2018 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" use Bplus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html use tableLib : script "Myriad Tables Lib" –https://www.macosxautomation.com/applescript/apps/Script_Libs.html#MyriadTablesLib –Numbersから書き出したUTF-8のCSVを読み取る set someString to read (choose file of type {"public.comma-separated-values-text"}) as «class utf8» –読み込んだテキストをParseして、ヘッダーとデータ本体に分離 set {theHeader, origList} to readCSVAndParse(someString) of me –Table UIを表示して内容を確認 set colMax to 3 –あらかじめ期待しているカラム数 set {dRes, tRes} to dispTableUI(theHeader, origList, colMax) of me if dRes = false then display dialog "データ不全のため処理を終了します" with title "CSVデータエラー" return else display dialog "CSVデータの処理を続行します" with title "CSVデータOK" end if on readCSVAndParse(someString) load framework using terms from script "BridgePlus" set theData to current application’s SMSForder’s arrayFromCSV:someString commaIs:"," set origList to (current application’s SMSForder’s subarraysIn:theData paddedWith:"" |error|:(missing value)) as list end using terms from set theHeader to contents of first item of origList –Header Row set origList to rest of origList –Data return {theHeader, origList} end readCSVAndParse on dispTableUI(theHeader, origList, colMax) set {curDispW, curDispH} to (current application’s NSScreen’s mainScreen()’s frame()’s |size|()) as list set curLen to length of first item of origList set dRes to (curLen = colMax) as boolean if dRes = true then set aMessage to "問題がなければ「OK」をクリックして実行してください" –Normal message set aTitle to "CSVファイルの内容確認" else set aMessage to "CSVファイルのカラム数が期待どおりではありません。「Cancel」をクリックして実行を停止してください" –Error Message set aTitle to "CSVファイルに異常あり" end if using terms from script "Myriad Tables Lib" tell script "Myriad Tables Lib" set aDispBounds to my makeInitialBounds:(curDispW – 100) withHeight:(curDispH – 100) set theTable to make new table with data origList column headings theHeader with title aTitle with prompt aMessage with row numbering, empty selection allowed and multiple lines allowed modify table theTable initial position aDispBounds –表を表示 set tRes to (display table theTable) return {dRes, tRes} end tell end using terms from end dispTableUI on makeInitialBounds:(aTWidth as integer) withHeight:(aTHeight as integer) set aDispBounds to current application’s NSScreen’s mainScreen()’s frame() set aWidth to (width of |size| of aDispBounds) set aHeight to (height of |size| of aDispBounds) set xPos to (aWidth div 2) – (aTWidth div 2) set yPos to (aHeight div 2) – (aTHeight div 2) return {xPos, yPos, aTWidth, aTHeight} end makeInitialBounds:withHeight: |