データとプログラムの分離
これまでは、処理したいデータを変更するためには、プログラムを修正する必要がありました。 例えば、自分が作ったプログラムをプログラムのわからないユーザーに渡して使ってもらう場合を考えてみましょう。 ユーザーはプログラムのことがわからないので、自分が処理したいデータを自由に変更することができません。 そこで、処理したいデータと処理するプログラムを分離する必要があります。 具体的には、処理したいデータをファイルに分離して、プログラム側ではファイルからデータを読み込むようにしなければなりません。
Processing でファイルを読み込むためには、スケッチディレクトリ内に data
という名前のフォルダを作り、その中に読み込みたいファイルを配置しましょう。
file_example.pde
というプログラムの中で、 data.txt
というファイルを読み込むとします。
このときのスケッチフォルダ内のファイル構成は以下のようになります。
.
├── data
│ └── data.txt
└── file_example.pde
「Sketch」メニューから「Show Sketch Folder」を選ぶことでスケッチフォルダを開くことができます。
ファイルの形式によって、Processing で読み込む方法は異なります。 ファイルの形式は、大きく テキストファイル と バイナリファイル に分類されます。 テキストファイルは文字列が格納されたファイルで、バイナリファイルは数値の列が直接格納されたファイルです。 文字列は文字コードの羅列なので、テキストファイルもバイナリファイルの一種として見做すことができます。 また、ファイルの中身がどのように構成されているかによって、より細かいファイル形式に分類されます。 例えば、各行を「,(カンマ)」で区切ることで表型のデータを表したテキストファイルは CSV 形式となります。
テキストファイルの読み込み
Proessing でテキストファイルを読み込むためには loadStrings
関数を使用します。
loadStrings
は、ファイル名の文字列を引数として受け取り、ファイルの 1 行 1 行を文字列として格納した文字列配列を返します。
以下のような内容のテキストファイルを data.txt
という名前で data
フィルダ内に保存しておきます。
これはテキストファイルの例です。
This is an example of a text file.
以下のような数字も文字列として読み込まれます。
123
456
789
data.txt
を読み込んで、内容をそのままコンソールに表示するプログラムは以下のようになります。
String[] rows = loadStrings("data.txt");
for (int i = 0; i < rows.length; ++i) {
println(rows[i]);
}
実行結果は以下のようになります。
これはテキストファイルの例です。
This is an example of a text file.
以下のような数字も文字列として読み込まれます。
123
456
789
テキストファイルからの数値の読み込み
上記のようにloadStrings
関数によって、ファイルの中身を文字列配列として読み込むことができます。
int
関数や float
関数を使うことで、文字列を整数や実数に変換することができました。
これを利用して、テキストファイルから数値を読み込むことができます。
以下のように、各行に整数を表す数字が格納されたテキストファイル digits.txt
を用意します。
-664
-3714
5317
6684
-7734
8433
6481
-9828
-6330
351
digits.txt
を読み込み、各行の数字を整数値として読み込んだ合計値を表示するプログラムは以下のようになります。
String[] rows = loadStrings("digits.txt");
int[] numbers = new int[rows.length];
for (int i = 0; i < rows.length; ++i) {
numbers[i] = int(rows[i]);
}
int sum = 0;
for (int i = 0; i < numbers.length; ++i) {
sum += numbers[i];
}
println(sum);