Сохранение потоковых данных из Unity в CSV-файл - PullRequest
0 голосов
/ 14 февраля 2019

Я должен записать данные координат (вектор x, y, z) Системы отслеживания глаз и сохранить их для последующей оценки.Вся система слежения за глазами интегрирована в монтируемый на голову дисплей, и программное обеспечение работает на Unity.

После некоторых исследований я понял, что сохранение данных в CSV-файл, вероятно, будет самым простым способом.Это то, что я получил до сих пор:

void update()
    {

    string filePath = @"C:\Data.csv";
    string delimiter = ",";

    Vector3 leftGazeDirection = smiInstance.smi_GetLeftGazeDirection();
    Vector3 rightGazeDirection = smiInstance.smi_GetRightGazeDirection();


    float[][] output = new float[][]{
    new float[]{leftGazeDirection.x},
    new float[]{leftGazeDirection.y},
    new float[]{leftGazeDirection.z},
    new float[]{rightGazeDirection.x},
    new float[]{rightGazeDirection.y},
    new float[]{rightGazeDirection.z} };


    int length = output.GetLength(0);

    StringBuilder sb = new StringBuilder();
    for (int index = 0; index < length; index++)
    sb.AppendLine(string.Join(delimiter, output[index]));

    File.WriteAllText(@"C:\Data.csv", sb.ToString());
}

То, что это выдает мне, - это файл CSV с вектором последней позиции направления движения.То, что мне нужно, - это запись всех Gazedirections, которые были сделаны за одну сессию.Возможно ли получить что-то подобное?

Могу ли я как-то изменить свой Код для достижения этого или я должен попробовать что-то совершенно другое?
Поскольку я очень новичок в единстве и программировании в целом, у меня просто нет словарного запаса и я не знаючто искать, чтобы решить мою проблему ..

Я был бы очень благодарен, если бы кто-нибудь мог мне помочь.:)

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Да.Вы можете иметь данные для одного целого сеанса.Смотрите не дальше, чем File.AppendAllText .В этом сценарии я предполагаю, что у вас есть 6 значений для двух указателей взгляда.В этом случае вам не нужно записывать его в виде многомерного массива, поскольку он просто тратит выделенную память.

Здесь мы можем перейти к сохранению его как 6 значений для каждой итерации вашего цикла.

string filePath = @"C:\Data.csv";
string delimiter = ",";

void Start()
{
  if(File.Exists(filePath))
      File.Delete(filePath);
}

void Update
{
    Vector3 leftGazeDirection = smiInstance.smi_GetLeftGazeDirection();
    Vector3 rightGazeDirection = smiInstance.smi_GetRightGazeDirection();

    float[] output = new float[]{
    leftGazeDirection.x,
    leftGazeDirection.y,
    leftGazeDirection.z,
    rightGazeDirection.x,
    rightGazeDirection.y,
    rightGazeDirection.z };

    int length = output.Length;

    StringBuilder sb = new StringBuilder();
    for (int index = 0; index < length; index++)
         sb.AppendLine(output[index],delimiter));

    if(!File.Exists(filePath))
        File.WriteAllText(filePath, sb.ToString());
    else
        File.AppendAllText(filePath, sb.ToString());
}

AppendAllText будет продолжать добавлять файл до конца выполнения.Обратите внимание, что у этого решения есть недостаток: в начале мы будем удалять файл для каждого сеанса, поэтому вам нужно будет вручную отслеживать каждый сеанс.

Так что если вы хотите сохранить кучу файлов, связанных с каждымсеанс и не переопределить тот же файл, мы можем включить дату и время при создании каждого файла.Поэтому вместо удаления старого файла для каждого нового сеанса мы создаем файл для каждого сеанса и записываем в него.Необходимо изменить только метод start, чтобы обрабатывать отметку даты и времени для добавления имени файла.Остальная часть цикла обновления будет такой же.

string filePath = @"C:\Data";
string delimiter = ",";

void Start()
{
    filePath = filePath + DateTime.Now.ToString("yyyy-mm-dd-hh-mm-ss") + ".csv";
}
0 голосов
/ 14 февраля 2019

Добро пожаловать в StackOverflow.Хороший вопрос и хорошо изложенный.

Предположительно, после того, как вы сохраните эти данные, вы захотите что-то с ними сделать.Я бы предположил, что ваша жизнь будет намного проще, если вы создадите базу данных для хранения ваших данных.Есть множество учебников по этому виду вещей, и, поскольку вы уже пишете на C #, это не должно быть слишком сложным для вас.

Я хотел бы создать базу данных SQL Server - либо Express, либо Developer Version.и то, и другое было бы бесплатно для вас.

На этом этапе я бы отказался от попыток Entity Framework или аналогичного, я бы просто использовал базовый SQLClient для подключения и записи в вашу базу данных.

Однаждывы начинаете использовать это, затем добавление чего-то вроде столбца Session для отделения одного сеанса от следующего становится простым, и все виды анализа, которые вы, возможно, захотите выполнить с данными, также станут намного проще.

Надеюсь, это поможет, иудачи в вашем проекте.

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