我必须记录眼动追踪系统的坐标数据(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。我需要的是一个会话中做出的所有凝视方向的记录。有可能得到这样的东西吗?
我可以以某种方式修改我的代码以实现此目的,还是应该尝试完全不同的方法?
由于我一般还是团结编程的新手,所以我只是缺乏词汇,不知道要寻找什么来解决我的问题。
如果有人可以帮助我,我将非常感激。 :)
答案 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";
}