1

我正在尝试使用本质上是记录数据库的 CSV 文件。在加载游戏时,我读入一条记录并实例化一个预制按钮,一次使用 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]);             
        }
    }   
}

更新:它现在似乎正在工作,但我需要进一步的帮助。在我的保存函数的更新版本中,您可以看到我用逗号将每条记录拆分为一个名为 dataValues 的数组。我对 dataValues 中的正确字段进行了更改,但现在当我执行 Log 语句时,文本被分成单行。您认为我可以如何将文件附加到一起写入原始 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

1

我建议将您的 CSV 文件提取到内存集合中,然后处置阅读器以确保它不再访问该文件。循环遍历内存中的集合并使用 writer 更新适当的值。此外,最好将 StreamReader 和 StreamWriter 实例放在 using 语句中,以确保它们被正确处理。

于 2020-07-14T20:51:37.797 回答
1

在您的代码中,您假设每一行至少包含 2 个字段(通过测试dataValues[1] == trickName)。还要检查长度:

if (dataValues.Length >=6 && dataValues[1] == trickName)
{
   ...
}

检查长度(至少)6,以便使用dataValues[5]有效。

于 2020-07-15T06:18:21.053 回答