zoukankan      html  css  js  c++  java
  • Unity C# CSV文件解析与加载(已更新移动端处理方式)

    在游戏开发过程中,经常要用到Excel编辑各类数据,如果可以直接用Excel支持的文件格式来读取数据,修改将非常便捷。

    Excel支持导出CSV类型的文件,这类文件不仅可以用Excel直接打开修改,即便用记事本打开也非常容易阅读,解析起来也很简单。

    下面给出CSV文件的解析类:

     1 using UnityEngine;
     2 using System.IO;
     3 using System.Text;
     4 
     5 public class CSV {
     6 
     7     static CSV csv;
     8     public static CSV GetIns()
     9     {
    10         if (csv == null)
    11             csv = new CSV();
    12         return csv;
    13     }
    14 
    15     //利用二维数组存储对应行和列中的字符串
    16     public string[][] m_ArrayData;
    17 
    18     public void LoadFile(string path,string fileName)
    19     {
    20         //读取新文件前保证之前的数据为空
    21         m_ArrayData = new string[0][];
    22         string fillPath = path + "/" + fileName;
    23 
    24         //解析每一行的数据
    25         string[] lineArray;
    26         try
    27         {
    28             //注意编码方式,这里用的是Windows系统自定义的编码方式Encoding.Default,其实也就是GB2312(简体中文),编码不对应的话解析出来很可能是乱码
    29             lineArray = File.ReadAllLines(fillPath, Encoding.Default);
    30             Debug.Log("file finded!");
    31         }
    32         catch
    33         {
    34             Debug.Log("file do not find!");
    35             return;
    36         }
    37 
    38         m_ArrayData = new string[lineArray.Length][];
    39         for (int i = 0; i < lineArray.Length; i++)
    40         {
    41             //CSV格式的文件采用英文逗号作为分隔符
    42             m_ArrayData[i] = lineArray[i].Split(',');
    43         }
    44     }
    45 
    46     //外部调用的取值接口,需要先LoadFile()后才能返回正确的数据
    47     public string GetVaule(int row,int col)
    48     {        
    49         return m_ArrayData[row][col];
    50     }

    2019.09.18日更新:

    1.上面的代码在Windows平台下运行是没问题的,后来发现在安卓端就会出现乱码问题;查阅资料后发现移动端一般不支持Window平台默认的GB2312(简体中文)编码方式。

    解决办法就是将文本修改为utf-8的编码,统一采用utf-8来解析文本,无论在Window还是移动端,utf-8都是支持的。

    文本的修改方式是直接用记事本打开csv文件,选择另存为,在编码那一栏修改为带BOM的UTF-8,注意一定要带BOM,不然Excel没办法正确读取,保存类型为所有文件:

    然后将上面代码的解析方式也改为utf-8即可:

    lineArray = File.ReadAllLines(fillPath, Encoding.GetEncoding("utf-8"));

    2.在安卓端直接用File类读取配置文件是有问题的,因为即使把CSV文件放到StreamingAssets中也是没办法直接读到的,必须要用Unity提供的WWW类(或者新版的UnityWebRequest)流式读取才行。

    好在Application.persistentDataPath的地址无论在哪个平台上都能够得到正确的地址,而且在移动端是可读可写的,这一点非常重要。因此,可以采取这样的操作:

    先用WWW类(或者新版的UnityWebRequest)将StreamingAssets文件夹下的CSV文件读取出来,然后再重新写到Application.persistentDataPath中去,之后就可以轻松用File类在Application.persistentDataPath地址下去读取CSV了。

    这样的话也不用再考虑平台的差异性了:

     1     IEnumerator LoadCSV(string fileName,UnityAction CompleteAction)
     2     {
     3         string sPath = Application.streamingAssetsPath + "/" + fileName;
     4         Debug.Log("sPath:" + sPath);
     5         WWW www = new WWW(sPath);
     6         while (!www.isDone)
     7         {
     8             yield return null;
     9         }
    10         Debug.Log("content2:" + www.text);
    11         File.WriteAllText(Application.persistentDataPath + "/" + fileName, www.text, Encoding.GetEncoding("utf-8"));
    12         CSV.GetIns().LoadFile(Application.persistentDataPath, fileName);
    13         CompleteAction();
    14     }
  • 相关阅读:
    C++使用静态类成员时出现的一个问题
    C++中的const_cast
    【位运算与嵌入式编程】
    电压取反电路
    bzoj4769
    初赛
    noip2011day2
    uva1252
    codeforces 703d
    poj[1734]
  • 原文地址:https://www.cnblogs.com/koshio0219/p/11426141.html
Copyright © 2011-2022 走看看