c#和Unity,更新已更改为CSV文件的记录

c#和Unity,更新已更改为CSV文件的记录,c#,csv,unity3d,streamwriter,write,C#,Csv,Unity3d,Streamwriter,Write,我正在尝试使用一个CSV文件,它本质上是一个记录数据库。在游戏加载时,我读取了一条记录并实例化了一个预置按钮,一次一个,带有CSV文件中的正确文本。按钮的索引并不总是与我在CSV文件中获取信息的记录的索引相同。到目前为止,我设置了一个保存函数,希望某些记录根据“名称”字段进行更改,以反映在CSV文件中。什么是一个简单的方法来完成这一点 下面是保存对CSV的更改的代码,Unity给了我一个异常,IOException:在路径上共享冲突: void WriteCSVFile() { Stre

我正在尝试使用一个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]);             
        }
    }   
}

更新:它似乎正在工作,但我需要更多的步骤帮助。在我的save函数的更新版本中,您可以看到我用逗号将每条记录拆分为一个名为dataValues的数组。我对dataValues中的正确字段进行了更改,但现在在执行Log语句时,文本被分隔为单行。您认为我如何将该文件追加到一起,以覆盖原始CSV文件?以下是对我的保存函数的更新:“”void WriteCSVFile(){


我建议将您的CSV文件提取到内存集合中,然后使用dispose reader确保它不再访问该文件。在内存集合中循环并使用writer更新适当的值。此外,最佳做法是使用语句将StreamReader和StreamWriter实例放在内存中,以确保它们已被释放正确。

在代码中,假设每一行至少包含2个字段(通过测试
数据值[1]==trickName
)。同时添加长度检查:

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

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

为什么有人否决了我的问题?这一点都没有帮助。至少留下一条评论解释为什么你决定否决voteI没有否决你的问题,但是发布YouTube链接不是一个好做法。你应该在这里发布你的代码。如果YouTube的链接消失,这个问题会发生什么?如果如果将其发布到您的问题中,其他人会如何发现类似的问题?该视频不会被索引,也无法为其他人搜索。stackoverflow的很大一部分是帮助下一个有类似问题的人以及发布问题的人。我做了一次编辑,包括我用于保存函数ElloWorld的代码,t感谢您的更新。至于您的错误,您不能同时从文件读取和写入文件。您的读卡器正在从写入器锁定文件。一个选项是写入临时文件,然后在最后将临时文件复制到原始文件上。对于您的新问题,您应该制作一篇新文章,而不是编辑您当前的文章。您可以在你的新问题中提到这个问题。因为我不知道你的数据是什么样子,我也不知道你希望数据会是什么样子。我唯一能建议的是…你的for/each循环是你每行都有记录的原因吗,如果是这样,这不是你想要的吗?谢谢你提供的信息,我会研究它。如果你将代码添加到e问题,我可以编辑我的答案并提供更多详细信息。我做了一次编辑,包括我正在使用的用于保存功能的代码。我正在处理解决方案,但它似乎将与内存中的集合一起工作。谢谢!谢谢,我感谢你的回答。我的代码现在似乎正在工作。我需要更多步骤的帮助。在更新的我的保存函数的版本您可以看到我分割了每条记录(一行数据)将逗号添加到名为dataValues的数组中。我对dataValues中的正确字段进行了更改,但现在在执行Log语句时,文本被分隔为单行。您认为我如何将文件追加到一起以写入原始CSV文件?有一个String.Join函数,它使用分隔符(逗号)和要连接的部分的字符串数组。将所有行(包括跳过的行)写入新文件写入新文件,然后复制到原始文件上。如果您只是覆盖原始文件,而您的应用程序崩溃,则原始文件将被销毁
if (dataValues.Length >=6 && dataValues[1] == trickName)
{
   ...
}