行列データの表計算ソフトとの連携

データの対応関係

 十進BASICの内部形式ファイルはCSVファイルを用いるので,EXCELなどの表計算ソフトとのデータの連携が可能です。
表計算ソフトと連携する場合には,CSVファイルと表計算のセルの対応を知っておく必要があります。
表計算ソフトでは,CSVファイルの1行がシート上の行(横方向)に対応します。
十進BASICでは,CSVファイルの1行と,READ文またはWRITE文の1回の実行とが対応します。
つまり,READ文,WRITE文にコンマで区切って書かれた項目が表計算ソフトの行(横方向)に対応します。
<Note.>
MAT WRITE文は1回の実行で配列中の全要素をCSVファイルの1行に出力します。
また,1回のMAT READ文の実行でよむデータは,すべてコンマで区切られている必要があります(コンマの直後は改行でもよい)。
したがって,MAT WRITE文,MAT READ文は,そのままでは表計算ソフトとの連携には使えないのが普通です。

表計算ソフトからデータを受け取る

 表計算ソフトで,氏名,住所,体重,身長を管理しているとします。
このデータをAドライブにdata.csvという名前でCSV形式で保存したとき,このデータをBASICで読むのには次のようにします。

100 DIM a$(1000),b$(1000),c(1000),d(1000)
110 OPEN #1:NAME "A:DATA.CSV", ACCESS INPUT , RECTYPE INTERNAL
120 LET n=1
130 DO
140    READ #1,IF MISSING THEN EXIT DO: a$(n),b$(n),c(n),d(n)
150    LET n=n+1
160 LOOP
170 CLOSE #1 

100行の配列宣言は,表計算の項目に対応させます。添え字の上限は実際のデータの個数より少なくならないように(多めに)書いておきます。
140行のREAD文には,表計算の項目に対応する添字付き変数を指定します。
170行の実行が終わると,データの件数がnに入り,配列にデータが読みこまれています。

 データ全体を配列に読み込むのでなく,行単位で読んで処理したいときは,

110 OPEN #1:NAME "A:DATA.CSV", ACCESS INPUT , RECTYPE INTERNAL
120 DO
130    READ #1,IF MISSING THEN EXIT DO: a$,b$,c,d
140    PRINT a$,b$,c,d
160 LOOP
170 CLOSE #1 

のようにすればできます。

データを表計算ソフトに渡す

 BASICで作成したデータを画面に表示する代わりにCSVファイルに書き出したいときは,たとえば,

110 OPEN #1:NAME "A:DATA.CSV", RECTYPE INTERNAL
120 ERASE #1
130 FOR x=0 TO 10
140    WRITE #1: x, SQR(x)
150 NEXT x
160 CLOSE #1
170 END

のように,ファイルを内部形式で開いて,PRINT文の代わりにWRITE文を用いて出力します。得られたファイルを表計算ソフトで読み込むと,第1列(A列)が0から10までとなり,第2列(B列)に対応する平方根の値が入るはずです。

  配列a$,b$,c,dの1番めからn番めまでの要素に収納されたデータを表計算ソフトに渡したいときは,次のようにします。

110 OPEN #1:NAME "A:DATA.CSV", RECTYPE INTERNAL
120 ERASE #1
130 FOR i=1 TO n
140    WRITE #1: a$(i),b$(i),c(i),d(i)
150 NEXT i
160 CLOSE #1

このデータを表計算ソフトで読み込んだとき,横方向がA$,B$,C,Dに,縦方向が添字の番号に対応します。

行列データ(2次元配列)

 MAT WRITE文を用いる場合は,1回のMAT WRITE文の実行で1行のデータが出力されます。つまり,これは,2次元配列をMAT WRITE文で書き出したCSVファイルを表計算ソフトで読むと,全データが一行(横一列)に読み込まれることを意味します。
2次元配列に入力された行列データを表計算ソフトでもその形に読み込みたいときは,次のいずれかの形で書き込めばよいでしょう。

例1 内部形式ファイルでWRITE文を使う

100 DIM a(2,3)
110 DATA 1,2,3
120 DATA 4,5,6
130 MAT READ a
140 OPEN #1: NAME "a:data.csv", RECTYPE INTERNAL
150 ERASE #1
160 FOR i=1 TO 2
170    WRITE #1:a(i,1),a(i,2),a(i,3)
180 NEXT i 
190 CLOSE #1
200 END


例2 テキストファイルで明示的にコンマを書き込む 

100 DIM a(2,3)
110 DATA 1,2,3
120 DATA 4,5,6
130 MAT READ a
140 OPEN #1: NAME "a:data.csv"
150 ERASE #1
160 FOR i=1 TO 2
170    FOR j=1 TO 3
180       PRINT #1:a(i,j);
190       IF j<3 THEN PRINT #1:","; ELSE PRINT #1
200    NEXT j
210 NEXT i 
220 CLOSE #1
230 END


例3 独自拡張機能の RECTYPE CSV を用いる

100 DIM a(2,3)
110 DATA 1,2,3
120 DATA 4,5,6
130 MAT READ a
140 OPEN #1: NAME "a:data.csv", RECTYPE CSV
150 ERASE #1
160 MAT WRITE #1: a
170 CLOSE #1
180 END


 表計算ソフトで書き出したCSV形式の行列データはそのままではMAT READ文では読めません。
あらかじめ,最後の行を除くすべての行の末尾にコンマを付加してやれば,MAT INPUT文やMAT READ文で読めるようになります。
あるいは,例1にならって,次のようにすればよいでしょう。
例4 一行ごとに読む

10 DIM a(2,3)
20 OPEN #1: NAME "a:data.csv"
30 FOR i=1 TO 2
40    INPUT #1:a(i,1),a(i,2),a(i,3)
50 NEXT i 
60 CLOSE #1
70 MAT PRINT a
80 END


例5 独自拡張機能の RECTYPE CSV を用いる

10 DIM a(2,3)
20 OPEN #1: NAME "a:data.csv",RECTYPE CSV
30    MAT READ #1:a
40 CLOSE #1
50 MAT PRINT a
60 END 

戻る