假设addressbook.csv中需要处理以下内容
Id,Name,Desc,Data0,Data1,Data2
1,User0,Todo,0,0.1,TRUE
2,User1,Todo,1,0.2,FALSE
3,User2,Todo,2,0.3,TRUE
TextAsset txtAssest = Resources.Load<TextAsset>(path);
string content = txtAssest.text;
int dataStartLineNumber = 1;
CSVFile file = new CSVFile(dataStartLineNumber);
file.Parse(content);
CSVFile构造函数中接受三个参数:
dataStartLineNumber:数据从第几行开始,这个案例中数据从第二行开始,所以dataStartLineNumber=1。
lineToken:行分隔符,默认是"\r\n"。
columnToken:列分隔符,默认是","。
因此可以支持解析非csv风格的文件 比如行分隔符是"\r",列分隔符是"\t"。
CSVFile会将行数据解析为CSVLine,所以CSVLine对应着相应的行数据
public class AddressBookData
{
public string Id;
public string Name;
public string Desc;
public string Data0;
public string Data1;
public string Data2;
}
public class AddressBookDataParser:CSVParser
{
//在这里实现解析逻辑
public override object GetData(List<string> datas)
{
AddressBookData rlt = new AddressBookData();
rlt.Id = datas[0];
rlt.Name = datas[1];
rlt.Desc = datas[2];
rlt.Data0 = datas[3];
rlt.Data1 = datas[4];
rlt.Data2 = datas[5];
return rlt;
}
}
List<AddressBookData> list = CSVMapper.Map<AddressBookData>(new AddressBookDataParser(), file);
如果你不需要保存csvfile的所有结构信息,也可以直接使用CSVMapper进行序列化
CSVMapper.Map<AddressBookData>(new AddressBookDataParser(), content,1);
当你想要保存CSVFile的完整结构,比如Header信息,以便今后还可以将csvfile保存成文件的时候,使用方法一
如果你不需要保存csvfile的所有结构信息,使用方法二
方法二比方法一少遍历一次
方法一因为需要构建CSVFile的信息,所以需要遍历一次,序列化时CSVMapper会再遍历一次。
如果不希望2次遍历,请使用方法二
public class AdressBookDataWriter:CSVDataWriter
{
public override void SetData(object data, CSVLineData lineData)
{
AddressBookData abData = data as AddressBookData;
if (abData == null)
{
return;
}
lineData.Clear();
lineData.AddData(abData.Id);
lineData.AddData(abData.Name);
lineData.AddData(abData.Desc);
lineData.AddData(abData.Data0);
lineData.AddData(abData.Data1);
lineData.AddData(abData.Data2);
}
}
修改第一行数据中的Name
List<AddressBookData> list = CSVMapper.Map<AddressBookData>(new AddressBookDataParser(), file);
AddressBookData data = list[0];
data.Name = "modify";
AdressBookDataWriter writer = new AdressBookDataWriter();
CSVLineData lineToModify = file.GetLineDataAt(0);
writer.SetData(data, lineToModify);
string finalCSVText = file.ToCSV();
你需要自己维护CSVFile中的数据行和序列化好的List的对应关系
List的行数和CSVFile中的行数不对应的情况下
CSVMapper.ToCSV(new AdressBookDataWriter(),file,list);
finalCSVText = file.ToCSV();
调用CSVFile.ToCSV()就可以得到csv文本
如果有上百行的数据的话,新建一个类然后手动添加属性是一个枯燥的工作,可以使用一下方法自动生成一个类文件内容
CSVCSFileData classFileData = CSVCSFileCreator.CreateDataClassFile("AdBbookData", file.GetHeaderAt(0));
//这里是类的文件内容,你可以使用File.WriteAllText保存成cs文件
Debug.Log(classFileData.SourceCode);
同样也可以生成一个Parser类
CSVCSFileData parserClassFileData = CSVCSFileCreator.CreateParserClassFile("AdBbookData", file);
Debug.Log(parserClassFileData.SourceCode);
你也可以参考源代码实现方式,根据自己的需求编写生成类工具