UNITY3D讀寫CVS格式文件錄製與存儲數據手套數據(jù)
2019/11/12 點(diǎn)擊:
說明:
1.寫入一個單元格時,如果含有逗號,則需要將整(zhěng)個字段用雙引號括起來;如果裏麵還有雙引號就替換成兩個雙引號。
2.寫入一行時,末尾要(yào)加上\r\n作為行分隔符。3.讀(dú)取時,也要根據上麵(miàn)的寫入規則進行解(jiě)析。
直接看代碼:
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;public class CSVTool { private static char _csvSeparator = ',';
private static bool _trimColumns = false; //獲取(qǔ)一(yī)個單元(yuán)格的寫入格(gé)式
public static string GetCSVFormat(string str)
{
string tempStr = str;
if (str.Contains(","))
{
if (str.Contains("\""))
{
tempStr = str.Replace("\"", "\"\"");
}
tempStr = "\"" + tempStr + "\"";
}
return tempStr;
} //獲取(qǔ)一行(háng)的寫入格式
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;
} //解析一行
public static ListParseLine(string line)
{
StringBuilder _columnBuilder = new StringBuilder();
ListFields = new List();
bool inColumn = false; //是否是在一個列元素裏
bool inQuotes = false; //是否需要轉義
bool isNotEnd = false; //讀取完畢未結束轉義
_columnBuilder.Remove(0, _columnBuilder.Length);
//空行(háng)也是一個空(kōng)元素,一個逗號是2個空元素
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)//這個字符已經結束(shù)了整行
{
if (character == '"') //正常轉義結束,且該行已經(jīng)結束
{
inQuotes = false;
continue; //當前字符(fú)不用添加,跳出後直結束後會添加該元素
}
else //異常結束,轉義未收尾
{
isNotEnd = true;
}
}
else if (character == '"' && line[i + 1] == _csvSeparator) //結束轉義,且後麵有可能還有數據
{
inQuotes = false;
inColumn = false;
i++; //跳過下(xià)一個字(zì)符
}
else if (character == '"' && line[i + 1] == '"') //雙引號(hào)轉義
{
i++; //跳過下(xià)一(yī)個字符
}
else if (character == '"') //雙引號單獨出現(這種(zhǒng)情況實際上已經是格式錯誤,為了兼容(róng)可暫(zàn)時不處理(lǐ))
{
throw new Exception("格式(shì)錯誤,錯誤的雙引號轉(zhuǎn)義");
}
//其他情況直接跳出,後麵正常添加
}
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置為(wéi)false,並且不處理當前字符,直接進行(háng)Add
{
Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());
_columnBuilder.Remove(0, _columnBuilder.Length);
}
else // append the current column
_columnBuilder.Append(character);
}
//(標準格式(shì)一行結尾不(bú)需要逗號(hào)結尾,而上麵for是遇到逗號才添加的,為了(le)兼容還要添加一次)
if (inColumn)
{
if (isNotEnd)
{
_columnBuilder.Append("\r\n");
}
Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());
}
else //如果inColumn為false,說明已經添加,一個字符(fú)為(wéi)分隔符,所(suǒ)以後麵要加上一個空元素
{
Fields.Add("");
}
return Fields;
}
//讀(dú)取文件
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]);
}
}
}
}
關於(yú)UNITY的路徑有4個類型:
Application.dataPath:該路徑指向我們Unity編輯器的(de)Asset文件夾(jiá)
Application.persistentDataPath:該路徑指向ioses和androids的沙盒路徑
Application.streamingAssetsPath:streamingAsset文件夾路徑,在任何平台都可以通過這(zhè)個路徑讀取到文件夾裏的內容(róng)
Application.temporaryCachePath:臨(lín)時數(shù)據文件路徑
- 上一(yī)篇(piān):WISEGLOVE數據手套的部分高校客戶 2019/11/29
- 下一篇:unity3d讀寫EXCEL文件的(de)方法 2019/11/12
