首先,我想说:“我知道有XML / JSON / YAML格式,我知道它们是如何工作的”。但现在我面临着导出CSV
格式文件的任务。
我在维基百科上阅读过CSV,在CSV主题上搜索了StackOverflow,但未找到答案。
正如我所读到的,这是未来Excel表格显示的流行格式。
好的,如果我有一个只有ValueType
属性的简单类,那就没关系。
public class MyClass
{
public int ID { get; set; }
public string Name { get; set; }
public string ToCsvString()
{
return string.Format("{0};{1}", ID, Name);
}
public static MyClass FromCsvString(string source)
{
var parts = source.Split(';');
var id = int.Parse(parts[0]);
var name = parts[1];
return new MyClass()
{
ID = id,
Name = name,
};
}
}
但是,如果我有一个更复杂的课程怎么办?例如,使用其他对象的List<>
。
public class MyClassWithList: MyClass
{
public MyClassWithList()
{
ItemsList = new List<string>();
}
public List<string> ItemsList { get; set; }
public string ToCsvString()
{
// How to format it for future according to CSV format?
return string.Format("{0};{1}", base.ToCsvString(), ItemsList.ToString());
}
public static MyClassWithList FromCsvString(string source)
{
var parts = source.Split(';');
var id = int.Parse(parts[0]);
var name = parts[1];
// How to get it back from CSV formatted string?
var itemsList = parts[2];
return new MyClassWithList()
{
ID = id,
Name = name,
ItemsList = new List<string>()
};
}
}
我应该如何将其序列化/反序列化为CSV
?
最后一个问题是如何在课程A
包含课程B
个实例时如何做同样的事情?
答案 0 :(得分:2)
首先,您必须压扁数据。
如果ClassA包含ClassB,那么您需要创建一个具有访问任何嵌套属性的属性的扁平POCO,例如: ClassB_PropertyA。
你实际上只有1个可变长度属性,它必须是最后一个属性,然后你可以在一个点代表一个列表属性之后有任何列。
其次,没有CSV Serliazation标准。有https://www.ietf.org/rfc/rfc4180.txt但这只涉及从字段中读取文本。像改变你的语言环境这样简单的东西可能会弄乱CSV库,因为在公共表示小数的文化中,分号将被切换为逗号。 Excel中还存在许多错误和边缘情况,导致对String的序列化存在问题。并且一些数据会自动转换为日期或时间。您需要确定打算使用哪个程序打开CSV并了解它如何处理CSV数据。
一旦你有一个平面POCO,那么CSV就是一个标题行,每个属性的名称后面跟着每个对象一行。有些图书馆可以帮助您解决这个问题。