c# и Unity, обновите записи, которые были изменены в файл CSV - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь работать с файлом CSV, который по сути является базой данных записей. При загрузке игры я читаю запись и создаю экземпляр кнопки префаба, по очереди с правильным текстом из файла CSV. Не всегда бывает так, что индекс кнопки будет таким же, как индекс записи, в которой я получил информацию в файле CSV. Пока что я настроил функцию сохранения, чтобы определенные записи, которые были изменены на основе поля «имя» трюка, отражались в файле CSV. Что было бы простым способом выполнить sh это?

Вот код, который сохраняет изменения в 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, но теперь текст разделяется на отдельные строки, когда я выполняю оператор журнала. Как вы думаете, я могу снова присоединить файл для записи поверх исходного 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();
        } 
    }
    
    '''

Ответы [ 2 ]

1 голос
/ 15 июля 2020

В вашем коде вы предполагаете, что каждая строка содержит как минимум 2 поля (путем тестирования на dataValues[1] == trickName). Также добавьте проверку длины:

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

Проверьте длину (как минимум) 6, чтобы использовать dataValues[5] было допустимо.

1 голос
/ 14 июля 2020

Я рекомендую извлечь ваш CSV-файл в коллекцию в памяти, а затем удалить программу чтения, чтобы убедиться, что она больше не обращается к файлу. L oop через коллекцию в памяти и используйте средство записи для обновления соответствующих значений. Кроме того, рекомендуется размещать экземпляры StreamReader и StreamWriter внутри операторов using, чтобы обеспечить их правильное размещение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...