入れ子のリストで、1アイテム目のアイテム数が他と同じかどうかチェック

{{1,2,3}, {4,5,6}}のような入れ子のリストで、全アイテムのアイテム数が同じかどうかチェックするAppleScriptです。基準となるアイテム数は1アイテム目({1,2,3})を用います。

CSVファイルをparseしてリストに変換し、リストに対して処理を行ってふたたびCSVファイルに書き出すような場合に使用します。合っているとtureを、そうでないとfalseを返します。たいして大きなデータを処理していなかったので、高速化処理などは一切行っていませんが……データの規模によっては高速化処理を行うことがふさわしいところです。

parseした結果としてすべてのアイテムでアイテム数が同じかどうかをチェックすることが目的です。

exceltable.png

オリジナルのデータは、Excel(あるいはNumbersやFileMaker Pro)上で、上図のような状態になっていることを想定しています。1行目がフィールド名ラベルになっているというパターンです(緑色の箇所)。

CSVからparseしたリストの項目数が合っていないと、そのあとでさまざまな処理を行おうにも……処理の内容を保証できません。そこで、まずは項目数が合っているかを検証すると安全でしょう。もちろん、フィールド付加などを行ったあとに項目数をカウントしてチェックを行うことも重要です。

ExcelなどからCSVファイルに書き出して、AppleScript側でCSVファイルをもとにデータ処理を行うケースは非常に多いです。AppleScriptの初心者が陥りがちなポイントですが……そのままExcelに対して必要なデータに(行や列を指定して)アクセスすると、当然のことながらデータ数が増えるとものすごく時間がかかります。selectionからデータを取得する例もありますが、selectionから取得できるデータの大きさに上限が存在していたりで、万能とはいえません(とくに、Mac OS X初期に開発されたExcel v.Xあたりはselectionで取得できるデータサイズの上限が小さめです)。

大量のデータ通信をアプリケーションに対して行って、それをもって「AppleScriptの処理が遅い」と判断するのは間違いです。AppleScriptの内部データ表現形式であるリスト型変数やレコードに取り込んで、その上で処理を行うのがセオリーです。

同様の例はテキストエディタのデータを処理する場合などに多々見られ……テキストエディタの編集中のファイルに対して、テキストエディタ経由でアクセスすれば当然のように遅くなります。しかし、「どのファイルを編集中なのか」という情報をテキストエディタから取得して、AppleScriptで自前でテキストファイルにアクセスして処理すれば圧倒的に高速になります。

スクリプト名:入れ子のリストで、1アイテム目のアイテム数が他と同じかどうかチェック
set aList to {{“ID”, “名称”, “アドレス”, “URL”, “データ”}, {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7}}

–リスト中のすべての項目(データ行)のフィールド数が同じかどうかチェック
set chRes to chkItemNumInEveryLine(aList) of me
–> true

–入れ子のリストで、1アイテム目のアイテム数が他と同じかどうかチェック
on chkItemNumInEveryLine(aList)
  set aList1 to contents of first item of aList
  
set aList2 to contents of items 2 thru -1 of aList
  
  
set aList1Len to length of aList1
  
repeat with i in aList2
    set tmpLen to length of i
    
if tmpLen is not equal to aList1Len then
      return false
    end if
  end repeat
  
  
return true
end chkItemNumInEveryLine

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

Leave a Reply