如何将对象列表转换为csv?

如果我有一个名为“Car”的对象列表:

public class Car { public string Name; public int Year; public string Model; } 

如何将对象列表转换为例如List 到csv?

  1. FileHelpers库
  2. 文字OleDb提供者
  3. 根据RFC-4180手动进行字符串连接
  4. 第三方库,例如Aspose.Cells可以在没有任何摩擦的情况下完成。 它非常快。

将以下方法添加到Car:

 String Escape(String s) { StringBuilder sb = new StringBuilder(); bool needQuotes = false; foreach (char c in s.ToArray()) { switch (c) { case '"': sb.Append("\\\""); needQuotes = true; break; case ' ': sb.Append(" "); needQuotes = true; break; case ',': sb.Append(","); needQuotes = true; break; case '\t': sb.Append("\\t"); needQuotes = true; break; case '\n': sb.Append("\\n"); needQuotes = true; break; default: sb.Append(c); break; } } if (needQuotes) return "\"" + sb.ToString() + "\""; else return sb.ToString(); } public void SerializeAsCsv(Stream stream) { stream.Write(Escape(Name)); stream.Write(","); stream.Write(Year.ToString()); stream.Write(","); stream.Write(Escape(Model)); stream.Write("\n"); } 

现在您可以序列化整个列表:

 foreach (Car car in list) { car.SerializeAsCsv(stream); } 

查看FileHelpers库。

从网站:

The FileHelpers are a free and easy to use .NET library to import/export data from fixed length or delimited records in files, strings or streams.

根据RFC-4180 ,这将确保线路终止,转义等各种问题得到正确处理。

我正在寻找一个解决方案,但我找到的答案都没有满足我的简单性。 我意识到我的自动CRUD代码已经有了答案。 我重新调整它并提出以下代码:

 using System.Reflection; ///  /// Using a bit of reflection to build up the strings. ///  public static string ToCsvHeader(this object obj) { Type type = obj.GetType(); var properties = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); string result = string.Empty; Array.ForEach(properties, prop => { result += prop.Name + ","; }); return (!string.IsNullOrEmpty(result) ? result.Substring(0, result.Length - 1) : result); } public static string ToCsvRow(this object obj) { Type type = obj.GetType(); var properties = type.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance); string result = string.Empty; Array.ForEach(properties, prop => { var value = prop.GetValue(obj, null); var propertyType = prop.PropertyType.FullName; if (propertyType == "System.String") { // wrap value incase of commas value = "\"" + value + "\""; } result += value + ","; }); return (!string.IsNullOrEmpty(result) ? result.Substring(0, result.Length - 1) : result); } 

这将为每个对象添加扩展方法。 用法如下:

 var burgers = new List(); var output = burgers.ToCsvHeader(); output += Environment.NewLine; burgers.ForEach(burger => { output += burger.ToCsvRow(); output += Environment.NewLine; }); var path = "[where ever you want]"; System.IO.File.WriteAllText(path, output); 

上面写这两种方法可能有更好的方法,但这对我的情况很有效。 希望它可以帮到某人。

您可以简单地覆盖ToString方法或创建ToCSVRow()方法

  public String ToCSVRow() { return Name + "," + Year.ToString() + "," + Model; } 

然后在需要的地方做这样的事情。

  using (StreamWriter file = new StreamWriter(@"C:\Wherever\yourfilename.txt")) { foreach (var item in yourlist) { file.WriteLine(item.ToCSVRow()); } } 

把逗号分隔的值放在一起我总是喜欢指向被低估的string.Join(string separator, string[] elements)静态方法,但是如果有辅助库,那可能是更好的东西。

我将按照本文实现一些附加的序列化行为。 如果您想获得幻想,可以在项目属性中创建一个设置。 此设置将确定您的类是使用csv还是默认的序列化。 然后,您可以通过此处显示的技术访问它。 考虑使用静态构造函数来读取appsettings并使一个布尔值可以访问序列化代码。 Vlads的代码看起来很棒,只需将其插入代码即可。 此外,您可以考虑其他更可取的方法来更改序列化行为。

或者创建一个名为“SerializeAsCSV”的接口,并使用它如下:

// MyCoolClass.csv的部分内容:

  public class MyCoolClass : ISerializeAsCSV, IDisposable { protected static bool serializesToCSV = false; static MyCoolClass() { serializesToCSV = (typeof(MyCoolClass).GetInterface("GrooveySoft.Shared.Interfaces.ISerializeAsCSV") == null) ? false : true; } public MyCoolClass(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { // your stuff here } public void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) { // your stuff here } } 

// ISerializeAsCSV.cs的内容

 using System.Runtime.Serialization; namespace GrooveySoft.Shared.Interfaces { ///  /// indicates that implementor will serialize to csv format ///  public interface ISerializeAsCSV : ISerializable { } } 

这应该让你开始。 。 。 我没有编译和测试过这个。 。 但你得到了一般的想法。

另一种选择是Linq to CSV ,这是NuGet提供的一个软件包。 有关示例用法,请参阅使用LINQ to CSV合并两个文件的内容 。