平常我們會將資料進行讀取與寫入到 .csv 檔,最近因為實驗室實驗的資料需要儲存,我希望能將我過程中的一些數據能同步到 Excel 儲存,方便我之後統計各項數據。所以這兩天我將會根據如何儲存資料到 .csv 的檔案,以及如何寫入資料到 .csv 的檔案。這邊會希望大家將你想要儲存的.csv檔案記得與我們的Scene 新增的環境同一個資料夾下。 那我們就開始今天寫入資料的實作。而因為主要我要做寫入資料為準,所以我這邊實做會比較複雜一些。
一般的 Excel file 是無法進行儲存的,必須要轉變成 ".csv 逗號間隔” 格式才能在 Unity 中使用。所以在 Excel 中另存新檔,選擇 CSV(逗號分隔)。
接著就會在 Unity 看到之前族儲存的 UserEndStudy 變成如下樣式在下面。
因為你今天要去使用檔案中的 Excel file 所以說務必要知道該檔案的位址。我們在該 UserEndStatus CSV檔案上按下右鍵。 點下 Show In Explorer 就可以看到該檔案的位址。
接著就複製該檔案資料的路徑。 如下
E:\NYCU\Lab\Project\Seated Teleport\Unity Project\Teleport\Assets\Teleport_Main\DataExportExcel\Data
UserEndStudy.csv
新增文本去 ShowFileUI
引入以下 函數庫避免等一下要用到的 StreamWriter 會產生錯誤。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using System.IO;
// UI text from the GUI
public Text filePathText;
public Text fileStatus;
public Text fileId;
private const string FILEPATH = @"E:\NYCU\Lab\Project\Seated Teleport\Unity Project\Teleport\Assets\Teleport_Main\DataExportExcel\Data"; // here change to your .csv file path
private const string EXCELNAME = "/UserEndStudy.csv";
private int file_id = 0;
private string statusStr;
[System.Serializable]
public class DataManager
{
}
[System.Serializable]
public class DataManager
{
public int id;
public string name;
public float time_need;
public int fatigue;
public string Now_time;
}
private List<DataManager> UsersDataList = new List<DataManager>();
這也就是每一次新增該List 內部的元素時,都要去將所有的資料進行儲存。
public void AddListElement(string _name, float _TpTime, int _TpNumber)
{
if(file_id >= 0)
{
file_id++;
UsersDataList.Add(new DataManager(){id = file_id, name = _name, time_need = _TpTime, fatigue = -_TpNumber, Now_time = GetStudyTime()});
}else{
Debug.LogWarning("List id empty!");
}
}
UsersDataList.Add(new DataManager(){id = file_id, name = _name, time_need = _timeNeed, fatigue = _fatigueNum, Now_time = GetStudyTime()});
Now_time = GetStudyTime()
string GetStudyTime()
{
PlayerPrefs.SetString("date time", System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
return PlayerPrefs.GetString("date time");
}
public void DeleteListEelement()
{
if(file_id > 0)
{
file_id--;
UsersDataList.RemoveAt(file_id);
}else{
Debug.LogWarning("List is empty!");
}
}
void showTheList()
{
Debug.Log("Capacity: " + UsersDataList.Capacity);
Debug.Log("Count: " + UsersDataList.Count);
}
這邊我們會需要將每筆資料形成列的樣式進行儲存。
儲存資料需要傳入進兩個參數 fileName 檔案名稱、 dataList 你想要儲存的資料的 List ,這個 List 就包含所有你之前存進去的資料內容。
List 內部就是一個 Obj,每個 Obj 都包含各個變數,如同以下呈現。
所以說要如何去使用該 List 資料內的參數呢? 可以透過以下方式進行。 這邊我是一次覆寫掉所有的資料在 Excel 中,也就是一次刷新所有的 Excel內的資料。
foreach(var obj in ListName) // var is the DataManager, obj is DataManager object
{
// then store the obj.eachDataName
}
void WriteToCSV(string fileName, List<DataManager> dataList)
{
using(var dataFile = new StreamWriter(FILEPATH + fileName)) // here you can change the fileName to get file
{
dataFile.WriteLine(returnDataRowName());
foreach(var ele in dataList)
{
dataFile.WriteLine($"{ele.id}, {ele.name}, {ele.time_need}, {ele.fatigue}, {ele.Now_time}");
}
dataFile.Close();
}
}
using(var dataFile = new StreamWriter(FILEPATH + fileName))
{
}
dataFile.WriteLine(returnDataRowName());
string returnDataRowName()
{
return "Id, Name, Need Time, Fatigue, Date Time";
}
dataFile.WriteLine($"{ele.id}, {ele.name}, {ele.time_need}, {ele.fatigue}, {ele.Now_time}");
foreach(var ele in dataList)
{
dataFile.WriteLine($"{ele.id}, {ele.name}, {ele.time_need}, {ele.fatigue}, {ele.Now_time}");
}
dataFile.Close();
void WriteToCSV(string fileName, List<DataManager> dataList)
{
using(var dataFile = new StreamWriter(FILEPATH + fileName)) // here you can change the fileName to get file
{
dataFile.WriteLine(returnDataRowName());
foreach(var ele in dataList)
{
dataFile.WriteLine($"{ele.id}, {ele.name}, {ele.time_need}, {ele.fatigue}, {ele.Now_time}");
}
dataFile.Close();
}
}
if(Input.GetKeyDown("l"))
{
statusStr = "Data into Excel List!";
AddListElement("Kevin", UnityEngine.Random.Range(0f, 10f), -(UnityEngine.Random.Range(1, 100)));
fileId.text = file_id.ToString(); // start to show 1
WriteToCSV(EXCELNAME, UsersDataList);
}else if(Input.GetKeyDown("k"))
{
statusStr = "Data remove Excel List!";
DeleteListEelement();
fileId.text = file_id.ToString();
WriteToCSV(EXCELNAME, UsersDataList);
}
首先開始程式會出現該UI。 會顯示目前資料的位置。
之後按下 L 新增八筆資料。看到以下的 UI 顯示。 接下來關閉 Unity 。
接下來就可以看到 UserEndStudy 會出現我們的資料!!! 但注意到若程式重新開啟執行就會覆寫掉這些剛剛傳出的數值。
在執行的過程中是可以開啟 Excel 但若要做任何資料讀寫的動作是不允許的,所以要關閉再開來檢查比如,以下先新增13個資料。開啟 Excel 檢查。
關閉 Excel 後!!! 接著去刪除掉資料到剩下 8個。接著開啟 Excel 。 成功就會看到剩下 8個資料了XD