对象实体到CSV序列化/转换
如何在C#中将所有值(属性)写入csv格式化字符串? 例如:
class Person(string firstName, string lastName, int_age); Person person = new Person("Kevin","Kline",33);
现在我想要一个字符串“Kevin; Kline; 33”
换句话说,我想将对象序列化为CSV
看看Josh Close的优秀CSVHelper库
var person = new Person("Kevin","Kline",33); using (var csv = new CsvWriter(new StreamWriter("file.csv"))) { csv.Configuration.HasHeaderRecord = false; csv.Configuration.Delimiter = ';'; csv.WriteRecord(person); }
输出:
Kevin;Kline;33
通过使用reflection,您可以从对象中检索属性信息
foreach (PropertyInfo prp in obj.GetType().GetProperties()) { if (prp.CanRead) { object value = prp.GetValue(obj, null); string s = value == null ? "" : value.ToString(); string name = prp.Name; ... } }
GetProperties
方法有一个重载接受BindingFlags
,您可以通过它来确定所需的属性,如私有/公共实例/静态。
你可以像这样组合它们
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
适用于您的问题,您可以写
List people = ...; Type type = typeof(Person); PropertyInfo[] properties = type.GetProperties(); var sb = new StringBuilder(); // First line contains field names foreach (PropertyInfo prp in properties) { if (prp.CanRead) { sb.Append(prp.Name).Append(';'); } } sb.Length--; // Remove last ";" sb.AppendLine(); foreach (Person person in people) { foreach (PropertyInfo prp in properties) { if (prp.CanRead) { sb.Append(prp.GetValue(person, null)).Append(';'); } } sb.Length--; // Remove last ";" sb.AppendLine(); } File.AppendAllText("C:\Data\Persons.csv", sb.ToString());
将字符串括在双引号中并通过将它们加倍来转义它们包含的双引号也是一个好主意。
你可以使用这样的东西:
... PropertyInfo[] properties = obj.GetType().GetProperties(); string CSVRow = ""; foreach (PropertyInfo pi in properties) { CSVRow = CSVRow + pi.GetValue(obj, null) + ";"; } CSVRow.Remove(CSVRow.Length - 1, 1); ...
我相信FileHelpers对此有好处,但我自己并没有在愤怒中使用它
像这样的东西:
public string ToCsv() { return string.Join(";", new string[]{ _firstName, _lastName, _age.ToString() }.Select(str=>Escape(str))); }
或者,使用reflection,
public static string ToCsv(this object obj) { return string.Join(";", this.GetType().GetProperties().Select(pi=> Escape(pi.GetValue(this, null).ToString()) )); }
Escape是一个合适的转义function。
一种可能的实现,即读取复杂对象(深层对象序列化),如具有属性对象数组的对象数组,并保存og格式为CSV文件的字符串:
private string ToCsv(string separator, IEnumerable
- 如何在不使用所有子节点中的XNamespace的情况下为子节点创建具有默认命名空间的XElement
- 使用Google Data API使用C#访问Google Spreadsheets会因Mono而失败
- RavenDB附件 – function怎么办?
- 类和数据类型有什么区别?
- Web客户端例外:基础连接已关闭:无法为SSL / TLS安全通道建立信任关系
- 你如何在C#.NET中“克隆”WebControls?
- 我应该使用类库来定位.NET Framework和C#版本?
- 多个消费者并查询C#BlockingCollection
- 在.NET 4中使用IntPtr时出现PInvokeStackImbalanceexception? (适用于.NET 3.5)