zoukankan      html  css  js  c++  java
  • Unity3D中读取CSV文件

    转自  https://www.cnblogs.com/lyh916/p/8588218.html

    参考链接:

    https://www.cnblogs.com/lulianqi/p/6385503.html

    http://blog.csdn.net/paul342/article/details/22800137

    说明:

    1.写入一个单元格时,如果含有逗号,则需要将整个字段用双引号括起来;如果里面还有双引号就替换成两个双引号。

    2.写入一行时,末尾要加上 作为行分隔符。

    3.读取时,也要根据上面的写入规则进行解析。

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using UnityEngine;
    
    public class CSVTool : MonoBehaviour {
        private static char _csvSeparator = ',';
        private static bool _trimColumns = false;
        //获取一个单元格的写入格式
        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(List<string> strList)
        {
            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]) + "
    ";
            return tempStr;
        }
        //解析一行
        public static List<string> ParseLine(string line)
        {
            StringBuilder _columnBuilder = new StringBuilder();
            List<string> Fields = new List<string>();
            bool inColum = false;//是否是在一个列元素里
            bool inQuotes = false;//是否需要转义
            bool isNotEnd = false;//读取完毕未结束转义
            _columnBuilder.Remove(0, _columnBuilder.Length);
    
            //空行也是一个空元素,一个逗号是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 (!inColum)
                {
                    // If the current character is a double quote then the column value is contained within
                    //如果当前字符是双引号,则列值包含在内
                    // double quotes, otherwise append the next character
                    //双引号,否则追加下一个字符
                    inColum = true;
                    if (character == '"')
                    {
                        inQuotes = true;
                        continue;
                    }
                }
                // If we are in between double quotes   如果我们处在双引号之间
                if (inQuotes)
                {
                    if ((i + 1) == line.Length)//这个字符已经结束了整行
                    {
                        if (character == '"')//正常转义结束,且该行已经结束
                        {
                            inQuotes = false;
                            continue;
                        }
                        else//异常结束,转义未收尾
                        {
                            isNotEnd = true;
                        }
                    }
                    else if (character == '"' && line[i + 1] == _csvSeparator)//结束转义,且后面有可能还有数据
                    {
                        inQuotes = false;
                        inColum = false;
                        i++;//跳过下一个字符
                    }
                    else if (character == '"' && line[i + 1] == '"')//双引号转义
                    {
                        i++;//跳过下一个字符
                    }
                    else if (character == '"')//双引号单独出现(这种情况实际上已经是格式错误,为了兼容暂时不处理)
                    {
                        throw new System.Exception("格式错误,错误的双引号转义");
                    }
                    //其他情况直接跳出,后面正常添加
                }
                else if (character == _csvSeparator)
                {
                    inColum = false;
                }
                // If we are no longer in the column clear the builder and add the columns to the list
                ////结束该元素时inColumn置为false,并且不处理当前字符,直接进行Add
                if (!inColum)
                {
                    Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());
                    _columnBuilder.Remove(0, _columnBuilder.Length);
                }
                else//追加当前列
                {
                    _columnBuilder.Append(character);
                }
            }
    
            // If we are still inside a column add a new one (标准格式一行结尾不需要逗号结尾,而上面for是遇到逗号才添加的,为了兼容最后还要添加一次)
            if (inColum)
            {
                if (isNotEnd)
                {
                    _columnBuilder.Append("
    ");
                }
                Fields.Add(_trimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());
            }
            else  //如果inColumn为false,说明已经添加,因为最后一个字符为分隔符,所以后面要加上一个空元素
            {
                Fields.Add("");
            }
            return Fields;
        }
        //读取文件
        public static List<List<string>> Read(string filePath, Encoding encoding)
        {
            List<List<string>> result = new List<List<string>>();
            string content = File.ReadAllText(filePath,encoding);
            string[] lines = content.Split(new string[] { "
    " }, StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < lines.Length; i++)
            {
                List<string> line = ParseLine(lines[i]);
                result.Add(line);
            }
            return result;
        }
        //写入文件
        public static void Write(string filePath, Encoding encoding, List<List<string>> result)
        {
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < result.Count; i++)
            {
                List<string> line = result[i];
                builder.Append(GetCSVFormatLine(line));
            }
            File.WriteAllText(filePath, builder.ToString(), encoding);
        }
        //打印
        public static void Debug(List<List<string>> result)
        {
            for (int i = 0; i < result.Count; i++)
            {
                List<string> line = result[i];
                for (int j = 0; j < line.Count; j++)
                {
                    UnityEngine.Debug.LogWarning(line[j]);
                }
            }
        }
    }

    读取csv的数据

    List<List<string>> lists;
    lists = CSVTool.Read(Application.streamingAssetsPath + "/TypeKeys.csv", Encoding.Default);
            //      行       列
            Debug.Log(lists[0][0]);
            //Debug.Log(lists[0][1]);
            Debug.Log(lists[1][0]);
            Debug.Log(lists.Count);

    另外

    关于路径有4个类型:

    Application.dataPath:该路径指向我们Unity编辑器的Asset文件夹

    Application.persistentDataPath:该路径指向iOS和Android的沙盒路径

    Application.streamingAssetsPath:streamingAsset文件夹路径,在任何平台都可以通过这个路径读取到文件夹里的内容

    Application.temporaryCachePath:临时数据文件路径

  • 相关阅读:
    Coding.net进阶,使用Git管理代码
    经典算法问题
    浅谈三款常用软件
    Coding.net简单使用指南
    湖北宜化总结
    天顺风能经验总结
    Vue中watch的高级用法
    html 锚点三种实现方法
    【机器学习】EM算法详细推导和讲解
    【机器学习】BP神经网络实现手写数字识别
  • 原文地址:https://www.cnblogs.com/lingLuoChengMi/p/9990488.html
Copyright © 2011-2022 走看看