C#、Unity 读取外部自定义文本文件

本文主要记录了使用C#解析外部自定义的文本文件。首先要解析文本文件,读取成功后,主要就是对文本文件的操作了。

1、先看看我自定义的文本文件(名叫:test.log):
在这里插入图片描述
2、直接用代码解析文本文件:
代码读取文本,首先设置路径,直接用File.ReadAddText()函数来解析文本

  //指定文件路径
        string logPath = Application.streamingAssetsPath + @"\Test.log";

        //在文件中读取出来的信息
        logMsg = File.ReadAllText(@logPath, Encoding.UTF8);

3、接下来就是对解析出来的string字符串的操作了,直接附上全部代码:

using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using UnityEngine;

/// <summary>
/// 读取自定义文本数据
/// </summary>
public class Teset : MonoBehaviour
{
    public UnityEngine.UI.Text showText;

    //文本中的人物信息
    public TextData textData = new TextData();
    
    string logMsg;//记录从文本中读出来的信息

    /// <summary>
    /// 文本中中括号的第一个标志符
    /// </summary>
    string mark_1 = "[Test 1]";
    /// <summary>
    /// 文本中中括号的第二个标志符
    /// </summary>
    string mark_2 = "[Read 1]";

    void Start()
    {
        //指定文件路径
        string logPath = Application.streamingAssetsPath + @"\Test.log";

        //在文件中读取出来的信息
        logMsg = File.ReadAllText(@logPath, Encoding.UTF8);

        //对 文本 做处理
        logMsg = StrHandle(logMsg);

        //得到有用的字符串信息,并赋值
        GetBeOfUseInfo(logMsg);
    }
    /// <summary>
    /// 字符串的处理
    /// </summary>
    /// <param name="str"></param>
    string StrHandle(string str)
    {
        //移除 文本 的开头结尾的 空格
        str = str.Trim();

        //查找文本中如果包含逗号(,)则替换为空字符
        str = str.Replace(",", "");

        //查找文本中的换行符替换为分号(;)用来 分割 每个字段
        str = str.Replace("\n", ";");

        //如果文本中有两个换行符,则会出现相邻的两个分号(;;)  需要替换成一个分号(;)
        while (str.Contains(";;"))
        {
            str = str.Replace(";;", ";");
        }

        //如果文本的最后不是分号(;) 则加上分号(;)
        if (str[str.Length - 1] != ';')
        {
            str += ";";
        }

        return str;
    }

    /// <summary>
    /// 获取到文本中有用的数据,并把数据赋值
    /// </summary>
    void GetBeOfUseInfo(string msg)
    {
        //文本中,第一个标志符下的内容用不到,直接去除就可以
        //只需要第二个标识符下面的信息,下面开始截取字符串
        int index = msg.IndexOf(mark_2, 0, msg.Length);
        if (index != -1)
        {
            msg = msg.Remove(0, index + mark_2.Length);
        }

        //对字符串的头和尾做出修正
        msg = StrStartEndHandle(msg);

        //以分号(;)为分隔符,分割字符串获取数据
        List<string> info = msg.Split(';').ToList();
        for (int i = 0; i < info.Count; ++i)
        {
            string str = info[i];

            if (str.Contains("winningPlayer"))
            {
                str = RemoveFutilityChar(str);
                textData.weinningPlayer = int.Parse(str);
            }
            else if (str.Contains("timeRemaining"))
            {
                str = RemoveFutilityChar(str);
                textData.timeRemaining = int.Parse(str);
            }
            else if (str.Contains("p1"))
            {
                SetPlayerData(textData.players[0], str);
            }
            else if (str.Contains("p2"))
            {
                SetPlayerData(textData.players[1], str);
            }
            else if (str.Contains("p3"))
            {
                SetPlayerData(textData.players[2], str);
            }
            else if (str.Contains("p4"))
            {
                SetPlayerData(textData.players[3], str);
            }
        }
    }

    /// <summary>
    /// 根据字符串设置玩家数据
    /// </summary>
    /// <param name="player"></param>
    /// <param name="str"></param>
    void SetPlayerData(Player player, string str)
    {
        //名字
        if (str.Contains("name"))
        {
            str = RemoveFutilityChar(str);
            player.name = str;
        }
        //生命值
        else if (str.Contains("life"))
        {
            str = RemoveFutilityChar(str);
            player.life = int.Parse(str);
        }
        //力量
        else if (str.Contains("power"))
        {
            str = RemoveFutilityChar(str);
            player.power = int.Parse(str);
        }
    }

    /// <summary>
    /// 给字符串的头和尾做出正确的处理
    /// </summary>
    string StrStartEndHandle(string str)
    {
        str = str.Trim();

        while (str.Length > 0 && str[0] == ';')
        {
            str = str.Remove(0, 1);
        }

        while (str.Length > 0 && str[str.Length - 1] == ';')
        {
            str = str.Remove(str.Length - 1, 1);
        }

        if (str[0] == ';' || str[0] == ' ' || str[str.Length - 1] == ';' || str[str.Length - 1] == ' ')
        {
            str = StrStartEndHandle(str);
        }

        return str;
    }

    /// <summary>
    /// 给字符串删除无用的字符
    /// </summary>
    string RemoveFutilityChar(string str)
    {
        //去掉字符串= 及=之前的字符
        int index = str.IndexOf("=", 0, str.Length);
        if (index != -1)
        {
            str = str.Remove(0, index + 1);
            str = StrStartEndHandle(str);
        }
        return str;
    }
}

[System.Serializable]
public class TextData
{
    public int weinningPlayer;
    public int timeRemaining;
    public Player[] players = new Player[4];
}

[System.Serializable]
public class Player
{
    public string name;
    public int life;
    public int power;
}

发布了14 篇原创文章 · 获赞 0 · 访问量 413

猜你喜欢

转载自blog.csdn.net/a0_67/article/details/105276273