c#和Unity,更新已更改为CSV文件的记录
c# and Unity, update records that have changed to a CSV file
我正在尝试使用本质上是记录数据库的 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();
}
}
'''
我建议将您的 CSV 文件提取到内存中的集合中,然后处理 reader 以确保它不再访问该文件。遍历内存中的集合并使用编写器更新适当的值。此外,最好将 StreamReader 和 StreamWriter 实例放在 using 语句中以确保它们被正确处理。
在您的代码中,您假设每一行至少包含 2 个字段(通过测试 dataValues[1] == trickName
)。还要检查长度:
if (dataValues.Length >=6 && dataValues[1] == trickName)
{
...
}
检查长度(至少)6,以便 dataValues[5]
的使用有效。
我正在尝试使用本质上是记录数据库的 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();
}
}
'''
我建议将您的 CSV 文件提取到内存中的集合中,然后处理 reader 以确保它不再访问该文件。遍历内存中的集合并使用编写器更新适当的值。此外,最好将 StreamReader 和 StreamWriter 实例放在 using 语句中以确保它们被正确处理。
在您的代码中,您假设每一行至少包含 2 个字段(通过测试 dataValues[1] == trickName
)。还要检查长度:
if (dataValues.Length >=6 && dataValues[1] == trickName)
{
...
}
检查长度(至少)6,以便 dataValues[5]
的使用有效。