纳金网

标题: (转载)Unity3D 读取CSV文件 [打印本页]

作者: 烟雨    时间: 2016-1-26 23:50
标题: (转载)Unity3D 读取CSV文件

今天看到一篇读取CSV文件的文章,也算是经验之谈,挺不错的,和大家分享下!!原文:http://www.manew.com/thread-46627-1-1.html?_dsign=1702534f
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. using System;  
  5. using System.Text;  
  6.    
  7. /// <summary>  
  8. /// 读取CSV工具类  
  9. /// (需求:UTF-8格式)  
  10. /// </summary>  
  11. public class LoadCSV : MonoBehaviour   
  12. {  
  13.     public delegate void  toDirectoryCallBack(Dictionary<string, List<string>> csvdata);  
  14.    
  15.     /// <summary>  
  16.     /// 异步开始读取CSV文档  
  17.     /// </summary>  
  18.     /// <param name="Filename">StreamingAssets目录内的文件名</param>  
  19.     /// <param name="LoadCBK">读取完成后的回调事件</param>  
  20.     /// <returns></returns>  
  21.     public IEnumerator LoadCSV_toDirectory(string Filename,toDirectoryCallBack LoadCBK)  
  22.     {  
  23.         string CSVText = null;  
  24.         yield return StartCoroutine(LoadWWW(GetFilepath(Filename), (www) => { CSVText = www; }));  
  25.         Dictionary<string, List<string>> CSVData = getDirectory(readcsv(CSVText.ToString()));  
  26.         LoadCBK(CSVData);  
  27.     }  
  28.    
  29.     /// <summary>  
  30.     /// 获取完整的文件路径  
  31.     /// </summary>  
  32.     /// <param name="Filename"></param>  
  33.     /// <returns></returns>  
  34.     string GetFilepath(string Filename)  
  35.     {  
  36.         switch (Application.platform)  
  37.         {  
  38.             case RuntimePlatform.Android:  
  39.                    return "jar:file://" + Application.dataPath + "!/assets/" + Filename + ".csv";  
  40.             case RuntimePlatform.IPhonePlayer:  
  41.                    return Application.dataPath + "/Raw/" + Filename + ".csv";  
  42.             default:  
  43.                    return "file://" + Application.dataPath + "/StreamingAssets/" + Filename + ".csv";  
  44.         }  
  45.     }  
  46.     /// <summary>  
  47.     /// 读取文件  
  48.     /// </summary>  
  49.     /// <param name="filepath">文件路径</param>  
  50.     /// <param name="loadCBK">读取完成回调</param>  
  51.     /// <returns></returns>  
  52.     IEnumerator LoadWWW(string filepath, Action<string> loadCBK)  
  53.     {  
  54.         WWW www = new WWW(filepath);  
  55.    
  56.         yield return www;  
  57.    
  58.         string CSVText;  
  59.         if (!string.IsNullOrEmpty(www.error))  
  60.         {  
  61.             CSVText = www.error;  
  62.         }  
  63.         else
  64.         {  
  65.             CSVText = www.text;  
  66.         }  
  67.         loadCBK(CSVText);  
  68.     }  
  69.    
  70.     public static List<List<string>> readcsv(string strin)  
  71.     {  
  72.         return readcsv(strin, Encoding.UTF8);  
  73.     }  
  74.    
  75.     public static List<List<string>> readcsv(string strin, Encoding encoding)  
  76.     {  
  77.         List<List<string>> ret = new List<List<string>>();  
  78.    
  79.         strin = strin.Replace("\r", "");  
  80.         string[] lines = strin.Split('\n');  
  81.    
  82.         if (lines.Length > 0)  
  83.         {  
  84.             byte[] byt = encoding.GetBytes(lines[0]);  
  85.             if (byt.Length >= 3 &&  
  86.                 byt[0] == 0xEF &&  
  87.                 byt[1] == 0xBB &&  
  88.                 byt[2] == 0xBF)  
  89.             {  
  90.                 lines[0] = encoding.GetString(byt, 3, byt.Length - 3);  
  91.             }  
  92.         }  
  93.    
  94.         for (int i = 0; i < lines.Length; i++)  
  95.         {  
  96.             if (string.IsNullOrEmpty(lines[i]) ||  
  97.                     lines[i].StartsWith("#"))  
  98.                 continue;  
  99.             List<string> s = split(lines[i], encoding);  
  100.             ret.Add(s);  
  101.         }  
  102.         return ret;  
  103.     }  
  104.    
  105.     static List<string> split(string line, Encoding encoding)  
  106.     {  
  107.         byte[] b = encoding.GetBytes(line);  
  108.         List<string> bls = new List<string>();  
  109.         int end = b.Length - 1;  
  110.    
  111.         List<byte> bl = new List<byte>();  
  112.         bool inQuote = false;  
  113.         for (int i = 0; i < b.Length; i++)  
  114.         {  
  115.             switch ((char)b[i])  
  116.             {  
  117.                 case ',':  
  118.                     if (inQuote)  
  119.                         bl.Add(b[i]);  
  120.                     else
  121.                     {  
  122.                         //bls.Add(makefield(ref bl, encoding));  // 将语句中的引号去掉
  123.                         bls.Add(encoding.GetString(bl.ToArray()));
  124.                         bl.Clear();  
  125.                     }  
  126.                     break;  
  127.                 case '"':  
  128.                     inQuote = !inQuote;  
  129.                     bl.Add((byte)'"');  
  130.                     break;  
  131.                 case '\\':  
  132.                     if (i < end)  
  133.                     {  
  134.                         switch ((char)b[i + 1])  
  135.                         {  
  136.                             case 'n':  
  137.                                 bl.Add((byte)'\n');  
  138.                                 i++;  
  139.                                 break;  
  140.                             case 't':  
  141.                                 bl.Add((byte)'\t');  
  142.                                 i++;  
  143.                                 break;  
  144.                             case 'r':  
  145.                                 i++;  
  146.                                 break;  
  147.                             default:  
  148.                                 bl.Add((byte)'\\');  
  149.                                 break;  
  150.                         }  
  151.                     }  
  152.                     else
  153.                         bl.Add((byte)'\\');  
  154.                     break;  
  155.                 default:  
  156.                     bl.Add(b[i]);  
  157.                     break;  
  158.             }  
  159.         }
  160.         //bls.Add(makefield(ref bl, encoding));  // 将语句中的引号去掉
  161.         bls.Add(encoding.GetString(bl.ToArray()));
  162.         bl.Clear();  
  163.    
  164.         return bls;  
  165.     }  
  166.    
  167.     static string makefield(ref List<byte> bl, Encoding encoding)  
  168.     {  
  169.         if (bl.Count > 1 && bl[0] == '"' && bl[bl.Count - 1] == '"')  
  170.         {  
  171.             bl.RemoveAt(0);  
  172.             bl.RemoveAt(bl.Count - 1);  
  173.         }  
  174.         int n = 0;  
  175.         while (true)  
  176.         {  
  177.             if (n >= bl.Count)  
  178.                 break;  
  179.             if (bl[n] == '"')  
  180.             {  
  181.                 if (n < bl.Count - 1 && bl[n + 1] == '"')  
  182.                 {  
  183.                     bl.RemoveAt(n + 1);  
  184.                     n++;  
  185.                 }  
  186.                 else
  187.                     bl.RemoveAt(n);  
  188.             }  
  189.             else
  190.                 n++;  
  191.         }  
  192.    
  193.         return encoding.GetString(bl.ToArray());  
  194.     }  
  195.    
  196.     /// <summary>  
  197.     /// 转换成Dictionary类型  
  198.     /// </summary>  
  199.     /// <param name="listin"></param>  
  200.     /// <returns></returns>  
  201.     public static Dictionary<string, List<string>> getDirectory(List<List<string>> listin)  
  202.     {  
  203.         Dictionary<string, List<string>> dir = new Dictionary<string, List<string>>();  
  204.         for (int i = 0; i < listin.Count; i++)  
  205.         {  
  206.             if (string.IsNullOrEmpty(listin[i][0]))  
  207.                 continue;  
  208.             dir[listin[i][0]] = listin[i];  
  209.         }  
  210.         return dir;  
  211.     }  
  212.    
  213.     /// <summary>  
  214.     /// 打印 Csv 转换的二维数组  
  215.     /// </summary>  
  216.     /// <param name="grid"></param>  
  217.     public static void DebugOutputGrid(string _titleName, Dictionary<string, List<string>> grid)  
  218.     {  
  219.         StringBuilder textOutput = new StringBuilder();  
  220.         textOutput.Append(_titleName);  
  221.         textOutput.Append("\n");  
  222.         foreach (var line in grid)  
  223.         {  
  224.             for (int i = 0; i < line.Value.Count; i++)  
  225.             {  
  226.                 string row = line.Value[i];  
  227.                 textOutput.Append(row);  
  228.                 if (i < line.Value.Count - 1)  
  229.                     textOutput.Append("|");  
  230.             }  
  231.             textOutput.Append("\n");  
  232.         }  
  233.         Debug.Log(textOutput);  
  234.     }  
  235. }
复制代码
使用代码如下:
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System;  
  4. using System.Collections.Generic;  
  5.    
  6. public class LoadCSVMain : MonoBehaviour {  
  7.    
  8.     // Use this for initialization  
  9.     void Start ()   
  10.     {  
  11.         StartCoroutine(loading());  
  12.     }  
  13.    
  14.     IEnumerator loading()  
  15.     {  
  16.         yield return StartCoroutine(LoadCSVData_debug());  
  17.     }  
  18.    
  19.     /// <summary>  
  20.     /// 读取CSV格式的文档  
  21.     /// </summary>  
  22.     /// <returns></returns>  
  23.     IEnumerator LoadCSVData_debug()  
  24.     {  
  25.         DateTime startTime = DateTime.Now;  
  26.    
  27.         Debug.Log("开始读取数据");  
  28.         LoadCSV loadcsv = gameObject.AddComponent<LoadCSV>();  
  29.    
  30.         Dictionary<string, List<string>> data = null;  
  31.         //读取技能表  
  32.         yield return StartCoroutine(loadcsv.LoadCSV_toDirectory("Skill", (csvdata) => { data = csvdata; }));  
  33.    
  34.         Debug.Log("读取技能表花费:" + (DateTime.Now - startTime).TotalMilliseconds + "ms");  
  35.         LoadCSV.DebugOutputGrid("技能表", data);  
  36.     }  
  37. }
复制代码

作者: Yaochilong    时间: 2016-6-22 12:50
顶顶顶顶顶顶顶顶顶顶顶




欢迎光临 纳金网 (http://c-www.narkii.com/club/) Powered by Discuz! X2.5