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

Posted

技术标签:

【中文标题】c#和Unity,更新已更改为CSV文件的记录【英文标题】:c# and Unity, update records that have changed to a CSV file 【发布时间】:2020-11-04 06:56:37 【问题描述】:

我正在尝试使用本质上是记录数据库的 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();
         
    
    
    '''

【问题讨论】:

为什么有人反对我的问题?这根本不是很有帮助。至少发表评论,解释您决定投反对票的原因 我没有否决您的问题,但发布 YouTube 链接并不是一个好的做法。你应该在这里发布你的代码。如果/当指向 YouTube 的链接消失时,这个问题会发生什么?如果它针对您的问题发布了解决方案,如果其他人遇到类似问题,他们将如何找到它?该视频不会被索引并可供其他人搜索。 *** 的很大一部分是帮助下一个遇到类似问题的人以及发布问题的人。 我做了一个编辑,包括我用于保存功能的代码 ElloWorld,感谢您的更新。至于您的错误,您不能同时从文件中读取和写入文件。您的阅读器正在锁定您的作者的文件。一种选择是写入临时文件,然后在最后将临时文件复制到原始文件上。 对于您的新问题,您应该发一个新帖子,而不是编辑您当前的帖子。你可以在你的新问题中参考这个问题。因为我不知道你的数据是什么样的,我也不知道你期望数据会是什么样子,我唯一能建议的是......你的 for/each 循环是你每次获得记录的原因行,如果是这样,那不是你想要的吗? 【参考方案1】:

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

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

   ...

检查长度(至少)6,这样dataValues[5]的使用才有效。

【讨论】:

谢谢,感谢您的回答。我的代码现在似乎可以工作了 我需要更多帮助。在我的保存函数的更新版本中,您可以看到我用逗号将每条记录(一行数据)拆分为一个名为 dataValues 的数组。我对 dataValues 中的正确字段进行了更改,但现在当我执行 Log 语句时,文本被分成单行。您认为我可以如何将文件重新附加到覆盖原始 CSV 文件? 有一个 String.Join 函数,它接受一个分隔符(你的逗号)和一个字符串数组来加入。将所有行(包括跳过的行)写入新文件 写入新文件,然后复制原始文件。如果你只是覆盖了原来的并且你的应用程序崩溃了,那么原来的就会被销毁【参考方案2】:

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

【讨论】:

谢谢你的信息,我会调查的。 如果您将代码添加到问题中,我可以编辑答案并提供更多详细信息。 我做了一个编辑,包括我用于保存功能的代码 我现在正在研究解决方案,但它似乎适用于内存中的集合。谢谢!

以上是关于c#和Unity,更新已更改为CSV文件的记录的主要内容,如果未能解决你的问题,请参考以下文章

iTunes Connect 和 Xcode 8:您的应用程序已更改为无效的二进制文件

Unity-创建C#模板

unity如何给csv文本新增行数据信息

CodeDom 将生成的 .cs 文件保存在哪里?我们可以将此位置更改为其他文件夹吗

已更改为 1.6

所有警报对话框消息和textField都已更改为单行。请检查图像