UNITY3D讀寫CVS格式(shì)文件錄製與存儲(chǔ)數據手套數據
2019/11/12 點擊(jī):
說明:
1.寫入一個單元格時,如果含有逗(dòu)號,則需要將整個字段用雙引號括起來(lái);如果裏麵還有雙引號就替換成兩個雙(shuāng)引號。
2.寫入一行時,末尾要加(jiā)上\r\n作為行分隔(gé)符。3.讀取時,也要根據上麵的寫入規則進行解析。
直接看代碼:
using System; using System.Collections.Generic; using System.IO; using System.Text;public class CSVTool { private static char _csvSeparator = ','; private static bool _trimColumns = false; //獲取一個單元格(gé)的(de)寫入格式 public static string GetCSVFormat(string str) { string tempStr = str; if (str.Contains(",")) { if (str.Contains("\"")) { tempStr = str.Replace("\"", "\"\""); } tempStr = "\"" + tempStr + "\""; } return tempStr; } //獲取一行的寫入格式 public static string GetCSVFormatLine(ListstrList) { string tempStr = ""; for (int i = 0; i < strList.Count - 1; i++) { string str = strList[i]; tempStr = tempStr + GetCSVFormat(str) + ","; } tempStr = tempStr + GetCSVFormat(strList[strList.Count - 1]) + "\r\n"; return tempStr; } //解析一行(háng) public static ListParseLine(string line) { StringBuilder _columnBuilder = new StringBuilder(); ListFields = new List(); bool inColumn = false; //是否(fǒu)是(shì)在一個列(liè)元素裏 bool inQuotes = false; //是否需要轉義 bool isNotEnd = false; //讀取完畢未結束轉義 _columnBuilder.Remove(0, _columnBuilder.Length); //空行也是一個空元素,一個逗號是2個空元(yuán)素 if (line == "") { Fields.Add(""); } // Iterate through every character in the line for (int i = 0; i < line.Length; i++) { char character = line[i]; // If we are not currently inside a column if (!inColumn) { // If the current character is a double quote then the column value is contained within // double quotes, otherwise append the next character inColumn = true; if (character == '"') { inQuotes = true; continue; } } // If we are in between double quotes if (inQuotes) { if ((i + 1) == line.Length)//這個字符已經結束了整行 { if (character == '"') //正(zhèng)常(cháng)轉義結束,且該行已經結(jié)束 { inQuotes = false; continue; //當前字符不(bú)用添加(jiā),跳出後直結束後會(huì)添加該元素 } else //異常結束,轉義未收尾 { isNotEnd = true; } } else if (character == '"' && line[i + 1] == _csvSeparator) //結束轉義,且後麵(miàn)有可能還有數(shù)據 { inQuotes = false; inColumn = false; i++; //跳過下一(yī)個字符 } else if (character == '"' && line[i + 1] == '"') //雙引號轉義 { i++; //跳過下一個字(zì)符 } else if (character == '"') //雙引(yǐn)號單獨出現(這種情況實際上已經是格式錯誤,為了(le)兼容可暫時不處理) { throw new Exception("格式錯誤,錯誤的雙引號(hào)轉義(yì)"); } //其(qí)他情況直接(jiē)跳出,後麵正常添加 } else if (character == _csvSeparator) inColumn = false; // If we are no longer in the column clear the builder and add the columns to the list if (!inColumn) //結束該元素時inColumn置為false,並且不處理當前字符,直接進(jìn)行Add { Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString()); _columnBuilder.Remove(0, _columnBuilder.Length); } else // append the current column _columnBuilder.Append(character); } //(標準格式一行結尾(wěi)不(bú)需要逗號結尾,而上麵for是遇到逗號才添加的,為了兼容還要(yào)添加一次(cì))
if (inColumn) { if (isNotEnd) { _columnBuilder.Append("\r\n"); } Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString()); } else //如果(guǒ)inColumn為false,說明(míng)已經添加,一個字符為分隔符,所(suǒ)以後麵要加上一個空元素 { Fields.Add(""); } return Fields; } //讀取文件 public static ListRead(string filePath, Encoding encoding) { Listresult = new List(); string content = File.ReadAllText(filePath, encoding); string[] lines = content.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < lines.Length; i++) { Listline = ParseLine(lines[i]); result.Add(line); } return result; } //寫入文件 public static void Write(string filePath, Encoding encoding, Listresult) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < result.Count; i++) { Listline = result[i]; builder.Append(GetCSVFormatLine(line)); } File.WriteAllText(filePath, builder.ToString(), encoding); } //打印 public static void Debug(Listresult) { for (int i = 0; i < result.Count; i++) { Listline = result[i]; for (int j = 0; j < line.Count; j++) { UnityEngine.Debug.LogWarning(line[j]); } } } }
關(guān)於UNITY的路徑有4個類型:
Application.dataPath:該路徑指(zhǐ)向我(wǒ)們Unity編輯器的Asset文件夾
Application.persistentDataPath:該路徑(jìng)指向(xiàng)ioses和androids的沙盒路(lù)徑
Application.streamingAssetsPath:streamingAsset文件夾路徑,在任(rèn)何平台都可以通過這(zhè)個路徑讀(dú)取到文件夾裏的內容
Application.temporaryCachePath:臨(lín)時數據文件路徑
- 上一篇:WISEGLOVE數據手套的部分高校客戶 2019/11/29
- 下(xià)一(yī)篇:unity3d讀寫EXCEL文件的方法 2019/11/12