C#でcsvを操作する

2022.4.22 7日目　昨日まで体調不良で死んでいました。再開します。

## やること
今回は、C#でcsvを作成したり、読み込んだりしていきます。
セーブデータを作ってみようかな？？ということでcsvを使ってみたいと思います。


## 環境
Windows
VisualStudio 2019
Unity 2019.4.28f1

## CSVの作成
csvが無ければ、csvを作成する　ということをしていきます。
設計的には次の通り。

1、保存用csvがあるかどうかを確認する
2、無ければ作成する

短いですが、こんなイメージで作成し始めました。
作成したクラスは以下の通りです。

```C#:InitializeData.cs
using System;
using System.IO;
using System.Text;
using UnityEngine;

//データの初期化
//保存用のcsvが無ければ作成


public class InitializeData: MonoBehaviour {

    [SerializeField] public int missionNum;
    [SerializeField] public GameObject Player;

    Entity_Sheet1 MasterData;

    // Start is called before the first frame update
    void Start() {
        //保存用のExcelを検索
        if( !isExistsSaveFile() ) {
            makeSaveData();
        }
    }

    private void makeSaveData() {
        MasterData = Resources.Load( "MissionMasterData" ) as Entity_Sheet1;
        try {
            // ファイルを開く//false：毎回上書きでcsvファイルを作成//エンコーディング
            StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
            for( int i = 0; i < missionNum; i++ ) {
                file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
            }
            file.Close();

        } catch( Exception e ) {
            Console.WriteLine( e.Message ); // 例外検出時にエラーメッセージを表示
        }
    }

    private bool isExistsSaveFile() {
        bool isExist = File.Exists( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
        return isExist;
    }
   
}
```

以下コードの説明です。

```C#
using System.IO;
using System.Text;
```
上記の2行を追加します。


```C#
void Start() {
        //保存用のExcelを検索
        if( !isExistsSaveFile() ) {
            makeSaveData();
        }
}
```
上記のstart関数で、csvファイルがあるかどうかの確認をする関数へ飛びます。なければ作成する関数へ行きます。

```C#
private bool isExistsSaveFile() {
        bool isExist = File.Exists( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
        return isExist;
}
```
上記の関数で、csvファイルがあるかどうかを確認しています。（これは結構応用できるかも…！）




以下の関数の説明です。（csvの作成に必要な箇所のみ説明します）
```C#
private void makeSaveData() {
        MasterData = Resources.Load( "MissionMasterData" ) as Entity_Sheet1;
        try {
            // ファイルを開く//false：毎回上書きでcsvファイルを作成//エンコーディング
            StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
            for( int i = 0; i < missionNum; i++ ) {
                file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
            }
            file.Close();

        } catch( Exception e ) {
            Console.WriteLine( e.Message ); // 例外検出時にエラーメッセージを表示
        }
}
```

```C#
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false);
```
上記で、書き込みたいフォルダを開くことができます。

```C#
for( int i = 0; i < missionNum; i++ ) {
    file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
}
```
上記のfor文で、一行ずつカンマ区切りでcsvに情報を書き込んでいきます。
（一行ずつカンマ区切りで、が結構大事…！）

```C#
file.Close();
```
上記のコードで、開いたファイルを閉じます。
（閉じないと、ずっと開いたままになってしまいます。なんで閉じなきゃいけないかは、今の私にはわかりません）

```C#
catch( Exception e ) {
      Console.WriteLine( e.Message ); // 例外検出時にエラーメッセージを表示
}
```
例外処理を記述しておきます。

この流れで、csvの作成はできました！

## CSVへの書き込み
次に、作成したcsvに書き込みをします。（重複しますが分けてみました）

```C#
try {
            StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );

            for( int i = 0; i < missionNum; i++ ) {
                //一行ずつ書き込み
                file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID + "," + missionClearFlag[ i ].ToString() );
            }
            
            file.Close();
        } catch( Exception e ) {
            Console.WriteLine( e.Message );
        }
    }
```

```C#
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );
```
作成時と同じように、csvフォルダを開きます。今回は書き込みなので、「SteamWriter」を宣言します。

```C#
for( int i = 0; i < missionNum; i++ ) {
    //一行ずつ書き込み
    file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID + "," + missionClearFlag[ i ].ToString() );
}
```
WriteLine　で、一行ずつカンマ区切りで書き込みます。

```C#
file.Close();
```
ファイルを閉じておきます。

```C#
catch( Exception e ) {
            Console.WriteLine( e.Message );
}
```
例外処理を書いておきます。

これで書き込みができました！

## CSVの読み込み
csvの読み込みをしていきます。これがなかなか私は理解できなかった…

```C#
try {
            StreamReader sr = new StreamReader( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
            
            string lineInfo = null;

            //1行ずつ読み込んで、情報がなくなるまで読み込む
            while( ( lineInfo = sr.ReadLine() ) != null ) {
                string line = sr.ReadLine();
                string[ ] values = line.Split( ',' );
                List<string> lists = new List<string>();
                lists.AddRange( values );
                if( ( lists[ count + 1 ] ) == null ) {
                } else {
                    //セーブデータからflagを取得
                    missionClearFlag[ count ] = Convert.ToBoolean( lists[ count + 1 ] );
                }
            }
            //ファイルを閉じる
            sr.Close();

        } catch ( Exception e ) {
            Console.WriteLine( e.Message );
        }
```

```C#
StreamReader sr = new StreamReader( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );
```
書き込み等と同じように、今度はSteamReaderを使用して、読み込みたいcsvフォルダを開きます。

```C#
string lineInfo = null;

//1行ずつ読み込んで、情報がなくなるまで読み込む
while( ( lineInfo = sr.ReadLine() ) != null ) {
     string line = sr.ReadLine();
     string[ ] values = line.Split( ',' );
     List<string> lists = new List<string>();
     lists.AddRange( values );
     if( ( lists[ count + 1 ] ) == null ) {
     } else {
     //セーブデータからflagを取得
        missionClearFlag[ count ] = Convert.ToBoolean( lists[ count + 1 ] );
     }
}
```

while文で、情報がない行にたどり着くまで繰り返していきます。
```C#
string line = sr.ReadLine();
```
↑この文で一行ずつ読み込み、

```C#
string[ ] values = line.Split( ',' );
```
↑この文で、リストに入れる、line で読み込んだ値をカンマ区切りにして、

```C#
List<string> lists = new List<string>();
```
↑この文で格納するリストを作成し、

```C#
lists.AddRange( values );
```
↑この文で、リストにカンマ区切りの値を入れます！

これで読み込みは終わりです。