1

基本的にレコードのデータベースである CSV ファイルを操作しようとしています。ゲームの読み込み時に、レコードを読み込み、プレハブ ボタンを 1 つずつ、CSV ファイルから正しいテキストでインスタンス化します。ボタンのインデックスが、CSV ファイルで情報を取得したレコードのインデックスと同じになるとは限りません。これまでのところ、トリックの「名前」フィールドに基づいて変更された特定のレコードを CSV ファイルに反映させる保存機能をセットアップしました。これを達成する簡単な方法は何ですか?

これは変更を CSV に保存するコードであり、Unity は例外、IOException: パス上の共有違反を与えます:

void WriteCSVFile()
{
    StreamReader strReader = new StreamReader("Assets/Resources/characters.csv.txt");
    StreamWriter strWriter = new StreamWriter("Assets/Resources/characters.csv.txt");
        
    bool endOfFile = false;
    string header = strReader.ReadLine();
    strWriter.WriteLine(header);
    string data;
        
    while(!endOfFile)
    {
        data = strReader.ReadLine();
        strWriter.WriteLine(data);
        
        if(data == null)
        {
            endOfFile = true;
            break;
        }
        
        //dataValues is each row
        var dataValues = data.Split(',');
        
        if(dataValues[1] == trickName)
        {               
            dataValues[3] = currentXP.ToString();
            dataValues[4] = currentLevel.ToString();
            dataValues[5] = maximumXP.ToString();
            strWriter.WriteLine(dataValues[3]);
            strWriter.WriteLine(dataValues[4]);
            strWriter.WriteLine(dataValues[5]);             
        }
    }   
}

更新: 現在は機能しているようですが、もう 1 つの手順についてサポートが必要です。私の保存関数の更新版では、各レコードをカンマで区切って dataValues という配列にしています。dataValues の適切なフィールドに変更を加えましたが、Log ステートメントを実行すると、テキストが 1 行に分割されます。ファイルを追加して元の CSV ファイルに上書きするにはどうすればよいと思いますか? これが私の保存機能の更新です: '''void WriteCSVFile(){

    string txt = System.IO.File.ReadAllText("Assets/Resources/characters.csv.txt");
    //StreamWriter strWriter = new StreamWriter("Assets/Resources/characters.csv.txt");
    
    string[] data = txt.Split(new char[] { '\n' });
    
    foreach(string record in data){
        var dataValues = record.Split(',');

        if(dataValues.Length >= 6 && dataValues[1] == trickName){
            Debug.Log(dataValues[1]);
            //dataValues[3] = currentXP.ToString();
            //dataValues[4] = currentLevel.ToString();
            //dataValues[5] = maximumXP.ToString();
        } 
    }
    
    '''
4

2 に答える 2