将Unity中的流式数据保存到csv文件中

时间:2019-02-14 01:11:13

标签: c# database csv unity3d

我必须记录眼动追踪系统的坐标数据(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文件,其中包含凝视方向最新位置的Vector。我需要的是一个会话中做出的所有凝视方向的记录。有可能得到这样的东西吗?

我可以以某种方式修改我的代码以实现此目的,还是应该尝试完全不同的方法?
由于我一般还是团结编程的新手,所以我只是缺乏词汇,不知道要寻找什么来解决我的问题。

如果有人可以帮助我,我将非常感激。 :)

2 个答案:

答案 0 :(得分:0)

欢迎使用StackOverflow。一个很好的问题,并提出了。

大概在保存完这些数据之后,您想要对其进行一些处理。我建议,如果您要创建一个数据库来存储数据,您的生活将会轻松很多。有很多关于这种事情的教程,并且由于您已经在用C#编写代码,因此对您来说应该并不难。

我将创建一个SQL Server数据库-Express版本或Developer Edition,两者都将免费提供给您。

在此阶段,我将避免使用Entity Framework或类似工具,而只是使用基本的SQLClient连接并写入您的数据库。

一旦您开始使用它,然后添加诸如“会话”列之类的内容以将一个会话与下一个会话分开就变得很容易,并且您可能想对数据进行的各种分析也将变得更加容易。

希望这会有所帮助,并为您的项目带来好运。

答案 1 :(得分:0)

是的。您可以拥有整个整个会话的数据。 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方法将需要更改以处理文件名附加的日期时间戳。 Update循环的其余部分将相同。

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

void Start()
{
    filePath = filePath + DateTime.Now.ToString("yyyy-mm-dd-hh-mm-ss") + ".csv";
}