ファイル入出力

ファイル入出力の方法について、artisoc4とartisoc Cloudの違いを解説します。

ファイル読み込み

以下のようなユースケースを想定して説明します。

  • 以下のようなcsv形式のファイルinput.csvの各行を順番に読み込み、2番目の要素を取得してコンソールにプリントする

input.csv

1, 2, 3, 4, 5
6, 7, 8, 9, 10 
11, 12, 13, 14, 15

ここでは説明の都合上単にプリントしていますが、実際にはファイルから取得した数値を変数に格納するようなケースが考えられます。

artisoc4の場合

artisoc4では、たとえば以下のように記述します。

Dim line as String
Dim data as String
Dim value as Integer

OpenFile("input.csv", 1, 1)
Do While(IsEofFile(1) == False)
    line = ReadFile(1)
    data = GetToken(line, 2)
    value = CInt(data)
    PrintLn(value)
Loop
CloseFile(1)

変数定義の後、処理の1行目でOpenFile関数を用いてファイルを読み込みます。2番目の引数はファイル識別のための番号で、何でもかまいませんが1を指定しています。3番目の引数はオープンモードで、ここでは読み込みなので1を指定します。ちなみに書き込みでは2、追記では3を指定します。

2行目ではIsEofFile関数を用いてファイル終了を判定し、while文を用いて最終行までの繰り返し処理を行っています。

3行目ではReadFile関数を用いて1行を読み込んでいます。たとえば最初の繰り返しでは、変数lineには1, 2, 3, 4, 5というように最初の行のデータが入ります。次の繰り返しではその次の行のデータが入ります。

4行目ではGetToken関数を用いてlineの2番目の要素を取得し変数dataに格納します。最初の繰り返しでは、変数dataには3が入ります(要素番号は0番目から数えることに注意します)。また、ここで変数dataは文字列型であることに注意します。

5行目では、CInt関数を用いて文字列型の変数dataを整数型に変換しています。(今回はコンソールに出力するだけのであまり意味がありませんが、数値データとして用いるならばこの処理が必要です)

6行目でコンソールにプリントします。2行目から6行目の処理をcsvファイルの各行に対して繰り返します。

最後にCloseFile関数を用いてファイルを閉じます。

実行するとコンソールには以下のように出力されます。

3
8
13

artisoc Cloudの場合

まったく同じ処理を行う場合、artisoc Cloudではたとえば以下のように記述します。

import csv
with open("input.csv", mode="r") as f:
    reader = csv.reader(f)
    for line in reader:
        data = line[2]
        value = int(data)
        print(data)    

1行目でcsvモジュールをインポートしています。これはcsvファイルを扱うのに便利な機能が入ったもので、このあと使用します。

2行目でwith openを用いてファイルを読み込み、変数fに格納しています。mode="r"でオープンモードを読み込みに設定しています。このあとの処理はインデント内に記述することに注意します。

3行目でcsvモジュールを用いて、readerオブジェクトを作成しています。これはcsvファイルの各行を収めたデータであると考えてください。

4行目でfor文を用い、csvファイルの各行を変数lineに収めて繰り返し処理を行います。

5行目でlineの2番目の要素を変数dataに格納しています。たとえば最初の繰り返しでは、lineはinput.csvの最初の行ですので[0, 1, 2, 3, 4, 5]というリストになります。よって、dataには2が入ります。ここでdataは文字列型であることに注意します。

6行目でint関数を用いて文字列型の変数データを整数型に変換しています。

7行目でコンソールにプリントします。5~7行目の処理をcsvファイルの各行に対して繰り返します。

ファイル書き込み

以下のようなユースケースを想定して説明します。

  • 毎ステップ終了時に、output.csvの1列目にステップ数を、2列目にUniverse変数hensuu値を追記する

たとえば、5ステップ目まで実行した場合にはoutput.csvは以下のようになります。

output.csv

"1","0.6824156034474742",
"2","0.48215025483320517",
"3","0.0464513240693708",
"4","0.8707409926140838",
"5","0.9415978124186635",

変数の値の変化を各ステップで記録するイメージです。(ここでは変数値は単なる乱数としています)

artisoc4の場合

artisoc4では、Univ_Step_Endに以下のように記述します。

OpenFileCSV("output.csv", 1, 3)
WriteFilecsv(1, GetCountStep(), False)
WriteFileCSV(1, Universe.hensuu, True)
CloseFilecsv(1)

1行目でOpenFileCSV関数を用いてファイルを開きます。2番目の引数はファイル識別のための番号で、何でもかまいませんが1を指定しています。3番目の引数はオープンモードで、ここではファイルの末尾に追記していくため3を指定します。(ちなみに1は読み込み、2はファイル内のデータを破棄してから書き込みます)

2行目でWriteFileCSV関数を用いてステップ数を書き込みます。3番目の引数は改行するかどうかで、ここではFalseを指定しているので、次にWriteFileCSVが呼ばれたときは同じ行に書き込まれます。

3行目で変数の値を書き込みます。3番目の引数にTrueを指定しているので、次にWriteFileCSVが呼ばれたときは次の行に書き込まれます。

4行目でファイルを閉じます。Univ_Step_Endに記述しているため、ここまでの処理が毎ステップ終了時に実行されます。

artisoc Cloudの場合

まったく同じ処理を行う場合、artisoc Cloudではuniv_step_endにたとえば以下のように記述します。

import csv
with open("output.csv", mode="a") as f:
    writer = csv.writer(f)
    data = [count_step(), Universe.hensuu]
    writer.writerow(data) 

1行目でcsvモジュールをインポートしています。これはcsvファイルを扱うのに便利な機能が入ったもので、このあと使用します。

2行目でwith openを用いてファイルを読み込み、変数fに格納しています。mode="a"でオープンモードを追記に設定しています(ちなみにmode="r"で読み込み、mode="w"でファイル内のデータを破棄してからの書き込みになります)。このあとの処理はインデント内に記述することに注意します。

3行目でcsvモジュールを用いて、writerオブジェクトを作成しています。これはcsvファイルに書き込むための道具を作ったものと考えてください。

4行目で書き込むためのデータをリスト形式で用意しています。0番目の要素にステップ数を、1番目の要素に変数を格納しています。

5行目でwriterオブジェクトのwriterow関数を用いてdataをファイルに書き込みます。これで、1列目にステップ数が、2列目に変数が追記されます。