AfterEffectsのエクスプレッションで、読み込んだcsvの行数を得るのが結構難しい。海外のフォーラムなどをあさるに、正式にcsvフッテージの行数を得るメソッドは用意されていないようだ。
以下の解説では、フッテージにdata.csvを読み込んであり、コンプレイヤーにも配置してあるとする。なお、data.csvの実データ1行目はデータそのものではなく、各カラムの名称が並んでいる必要がある。ヘッダー行というやつだ。
データへのアクセスのおさらい
レイヤーに配置したcsvアクセス
フッテージではなく、一度レイヤーに配置すれば以下のエクスプレッションで行数、、が取得できるが、これは現在選択中の行番号だ。選択行とか訳してほしい。
thisComp.layer("data.csv")("データ")("行数")以下の書式でデータにアクセスできるが({}で囲って記述がある部分は実際のデータに合わせる)、ここで行数指定が範囲を超えているとエラーになる。
thisComp.layer("data.csv")("データ")("Outline")("{カラム名}")("{カラム名} {行数}")そもそもレイヤーに配置するのはAEのGUIでアクセスしやすくするためだろう。Scriptからアクセスするなら直接フッテージを見ればいい。
フッテージへのアクセス
データへのアクセスは以下。位置の指定は行とカラムの順ではなく、カラムと行の順。
thisLayer.footage('data.csv').dataValue([{カラム数}, {行数}])やはりここでも行数指定が範囲を超えているとエラーになる。
CSVファイルの行数を得る
本題。フォーラムではFileオブジェクトでcsv読み込んで数えろとか雑?な回答もあったが、手元で試したところ
thisLayer.footage('telop.csv').sourceText.split(/\n/).length - 2)このコードで行けた。行けたが問題はある(後述)。sourceTextというプロパティでcsv解釈前の生のテキストをとれるので、改行コードで分解をして行数を数えている。最後のマイナス2は何なのかというと1つはヘッダー行の分、もう一つはcsvデータの最後の空行の分だ。
この方法の問題
エクスプレッションなどでこのコードを呼ぶ場合、大きなテキストを毎度splitするわけで処理の無駄が気になる。Fileオブジェクト使わなくとも処理の意味としては同じである。行数を一度グローバル変数などに記憶してしまう方法もあるかもしれないが、csvが外部更新されたときに行数が更新されなくなってしまうのではないだろうか。処理の無駄は速度的に問題にならないなら無視してもいいんだが。
もう一つは、外部データの書き方によって行数が正しく取れなくなってしまう事だ。csvの最後の空行がたくさんついていると行数が多く計算されてしまうし、最後のデータ行末に改行がないと少なく計算されてしまう。ここは運営でカバーかもしれない。
自分としてのワークアラウンド
そもそもcsvを使わない。jsonでデータを流し込んだほうがscriptアクセスがずっと楽だ。csvを使うのはチーム作業では利点がありそうだが、一人制作でかつscriptを活用しまくるスタイルであれば、csvを扱ううまみはそこまでない。データソースがスプレッドしーちなどである場合は、csvからjsonにコンバートしてもよいかもしれない。
という事でこのブログでの作例は当面csvではなくjsonを読み込むスタイルとる予定である。というかjsonさえ読み込まないでjsx(という拡張子のjson)にすべて書いてしまうかもしれない。だって楽なんだもの。



