本文主要记录了使用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 Test : 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;
}
}
public class TextData
{
public int weinningPlayer;
public int timeRemaining;
public Player[] players = new Player[4];
}
public class Player
{
public string name;
public int life;
public int power;
}