01 データのリスト化
Cindyscriptでは,データを「リスト」で扱います。まずは,「リスト」を理解しましょう。
例として使っていくデータは,このページの下部からダウンロードできます。「strength.csv」です。
「リスト」とは
リストは,「もの」を集めたものです。「もの」は,数でも,文字列でも,リストでも,また,それらが混在していても構いません。
リストは,集めたものをコンマで区切り,角かっこ [] でくくります。
例1: 整数のリスト [1,4,2,6,3,7]
例2: 実数のリスト [1/2,0.23,sqrt(2),pi] ( sqrt(2)は√2,pi は円周率 )
例3: 文字列のリスト ["月","水","金"]
例4: リストのリスト [[1,"月"],[2,"火"],[3,"水"]]
データの記述・コピー・読み込み
データは,Cindyscriptのスクリプトエディタに直接打ち込むか,他ソフトからコピーするか,テキストファイルを読み込むかの3つの方法のいずれかの方法で用意します。直接打ち込むのは問題ないでしょう。テキストデータを読み込むのはディレクトリ(フォルダ)の指定が必要でちょっと面倒です。ここでは「他ソフトからコピーする」という方法を使いましょう。
なお,直接打ち込むときも,以下の方法でコピーしたときと同じ形式でデータを書き込みます。
テキストエディタからコピーする
表計算ソフトから書き出されるデータ形式に CSV というものがあります。データをコンマで区切ったものです。これはテキストファイルなので,テキストエディタで読み込むことができます。
次の図は,高校生の新体力テストの結果を表計算ソフトで入力し,CSVファイルに書き出したものをテキストエディタで読み込んだ状態を示します。
このテキストエディタで読み込んだ CSV 形式のデータをそのままコピーします。
まず,Cindyscriptエディタの Initialization スロットに,「Orgdata="";」を書いておきます。
テキストエディタに戻って,Ctrl+A (Mac は⌘+A:以下同様)ですべてを選び,Ctrl+C でクリップボードにコピーし,Initialization スロットの,""の間に Ctrl+V で貼り付けます。
全体が文字列になりますが,CSVデータと同様,各行末で改行されています。
表計算ソフトからコピーする
次の図は,表計算ソフトに入力された状態です。
テキストエディタのときと同様に,データ範囲を選んで,Ctrl+C と Ctrl+V で Initialization スロットのページにコピー・ペーストします。
こんどは,コンマで区切られていないのがおわかりでしょうか。表計算ソフトのワークシートからコピーすると,TABで区切られたものになります。
文字列からリストへ
データをコピーしたとき,Cindyscriptエディタの方では,全体を文字列としました。データはコンマと改行,またはTABと改行で区切られています。
このように「区切られた」文字列をリストに変換(分解)するのが tokenize() という関数です。
コンマと改行で区切られた文字列をリストに変換するには
datalist=tokenize(Orgdata,[unicode("000a"),","]);
とします。TABと改行の場合には
datalist=tokenize(Orgdata,[unicode("000a"), unicode("0009")]);
とします。
これを Drawスロットに書き,できたリストをコンソールに println(datalist) ;で表示してみましょう。
このように,もとの表の1行がコンマ区切りで1つのリストになり,それらが全体でまたリストになっています。(最初が [[ であることに注意しましょう。つまり [[],[],・・・[]] の形です。)
この「リストのリスト」が頭の中で表計算ソフトのワークシートのような表に見えれば,あとの処理はどんどんできるようになります。これから,いろいろな作業をしながら,それに慣れましょう。
ちょっとしたエラー対策
データを入力する場合も,コピー・アンド・ペーストする場合も,最後の1行の末尾がちょっと問題になります。
はじめに Orgdata=""; を書いておいて,2つのダブルクウォーテーションの間にペーストするのですが,最後のデータのところで改行されて," が次の行の先頭になってしまうことがあります。
データを直接この形で入力するときも同様です。
こうなっていると,リスト化したときの最後の要素が空リスト[]になります。
これをそのままにしておくと,具合が悪いので,はじめに,文字列 Orgdata の末尾が改行 (000a) だけかどうかを調べて,改行だけの場合はこれを取り除いておきます。
if(Orgdata_(-1)==unicode("000a"),
Orgdata=substring(Orgdata,0,length(Orgdata)-1);
);
datalist=tokenize(Orgdata,[unicode(“000a"),","]);
<注> strength.csv は,このページを書いたあとで若干修正しています。「ハンドボール投げ」を「ハンドボール」としています。