LoginSignup
4
6

More than 1 year has passed since last update.

C#でcsvを操作する

Posted at

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

やること

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

環境

Windows
VisualStudio 2019
Unity 2019.4.28f1

CSVの作成

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

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

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

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;
    }
   
}

以下コードの説明です。

using System.IO;
using System.Text;

上記の2行を追加します。

void Start() {
        //保存用のExcelを検索
        if( !isExistsSaveFile() ) {
            makeSaveData();
        }
}

上記のstart関数で、csvファイルがあるかどうかの確認をする関数へ飛びます。なければ作成する関数へ行きます。

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

上記の関数で、csvファイルがあるかどうかを確認しています。(これは結構応用できるかも…!)

以下の関数の説明です。(csvの作成に必要な箇所のみ説明します)

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 ); // 例外検出時にエラーメッセージを表示
        }
}
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false);

上記で、書き込みたいフォルダを開くことができます。

for( int i = 0; i < missionNum; i++ ) {
    file.WriteLine( MasterData.sheets[ 0 ].list[ i ].ID.ToString() + "," + "false" );
}

上記のfor文で、一行ずつカンマ区切りでcsvに情報を書き込んでいきます。
(一行ずつカンマ区切りで、が結構大事…!)

file.Close();

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

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

例外処理を記述しておきます。

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

CSVへの書き込み

次に、作成したcsvに書き込みをします。(重複しますが分けてみました)

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 );
        }
    }
StreamWriter file = new StreamWriter( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv", false, Encoding.UTF8 );

作成時と同じように、csvフォルダを開きます。今回は書き込みなので、「SteamWriter」を宣言します。

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

WriteLine で、一行ずつカンマ区切りで書き込みます。

file.Close();

ファイルを閉じておきます。

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

例外処理を書いておきます。

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

CSVの読み込み

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

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 );
        }
StreamReader sr = new StreamReader( @"C:\StudyUnity\Test\Assets\SaveData\testSaveData.csv" );

書き込み等と同じように、今度はSteamReaderを使用して、読み込みたい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 ] );
     }
}

while文で、情報がない行にたどり着くまで繰り返していきます。

string line = sr.ReadLine();

↑この文で一行ずつ読み込み、

string[ ] values = line.Split( ',' );

↑この文で、リストに入れる、line で読み込んだ値をカンマ区切りにして、

List<string> lists = new List<string>();

↑この文で格納するリストを作成し、

lists.AddRange( values );

↑この文で、リストにカンマ区切りの値を入れます!

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

4
6
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6