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



