# ファイル入出力 ファイル入出力の方法について、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列目に変数が追記されます。