2010-07-07 4 views
9

derzeit, ich habe:Gibt es eine schnelle Möglichkeit, eine Entität in CSV-Datei zu konvertieren?

 string outputRow = string.Empty; 
     foreach (var entityObject in entityObjects) 
     { 
      outputRow = entityObject.field1 + "," + entityObject.Field2 etc.... 
     } 

ich zum Entity Framework noch neu bin, gibt es einen schnelleren Weg?

+0

Es sieht Wie die Antworten alle verwenden Reflexion. Ich wäre neugierig auf irgendeinen Weg, dies ohne Nachdenken zu tun. Ich schätze, es ist vielleicht nicht möglich. –

+0

Sie können meinen Dateischreiber mit sehr geringem Gewicht versuchen: https://gist.github.com/eranbetzalel/5371817#file-delimitedfilewriter-cs –

Antwort

22

Beispielcode, der eine einfache, aber leistungsfähige Art und Weise zeigt, zu bewerkstelligen, was Sie ohne Notwendigkeit einer festen Code Eigenschaftsnamen (mit Reflexion) wollen:

/// <summary> 
/// Creates a comma delimeted string of all the objects property values names. 
/// </summary> 
/// <param name="obj">object.</param> 
/// <returns>string.</returns> 
public static string ObjectToCsvData(object obj) 
{ 
    if (obj == null) 
    { 
     throw new ArgumentNullException("obj", "Value can not be null or Nothing!"); 
    } 

    StringBuilder sb = new StringBuilder(); 
    Type t = obj.GetType(); 
    PropertyInfo[] pi = t.GetProperties(); 

    for (int index = 0; index < pi.Length; index++) 
    { 
     sb.Append(pi[index].GetValue(obj, null)); 

     if (index < pi.Length - 1) 
     { 
      sb.Append(","); 
     } 
    } 

    return sb.ToString(); 
} 

Mehr dazu:

Objects to CSV

Are there any CSV readers/writer lib’s in c#

Writing a CSV file in .net

LINQ to CSV : Getting data the way you want

LINQ to CSV library

4

nahm ich Leniel Vorschlag und wickelte ihn in einem voll funktionsfähigen "writer" up, die Sie auch die Eigenschaften, die Sie geschrieben werden sollen filtern können. Hier ist der Code für die Nutzung:

public class CsvFileWriter 
{ 
    public static void WriteToFile<T>(string filePath, List<T> objs, string[] propertyNames) 
    { 
     var builder = new StringBuilder(); 
     var propertyInfos = RelevantPropertyInfos<T>(propertyNames); 
     foreach (var obj in objs) 
      builder.AppendLine(CsvDataFor(obj, propertyInfos)); 

     File.WriteAllText(filePath, builder.ToString()); 
    } 

    public static void WriteToFileSingleFieldOneLine<T>(string filePath, List<T> objs, string propertyName) 
    { 
     var builder = new StringBuilder(); 
     var propertyInfos = RelevantPropertyInfos<T>(new[] { propertyName }); 
     for (var i = 0; i < objs.Count; i++) 
     { 
      builder.Append(CsvDataFor(objs[i], propertyInfos)); 

      if (i < objs.Count - 1) 
       builder.Append(","); 
     } 

     File.WriteAllText(filePath, builder.ToString()); 
    } 

    private static List<PropertyInfo> RelevantPropertyInfos<T>(IEnumerable<string> propertyNames) 
    { 
     var propertyInfos = typeof(T).GetProperties().Where(p => propertyNames.Contains(p.Name)).ToDictionary(pi => pi.Name, pi => pi); 
     return (from propertyName in propertyNames where propertyInfos.ContainsKey(propertyName) select propertyInfos[propertyName]).ToList(); 
    } 

    private static string CsvDataFor(object obj, IList<PropertyInfo> propertyInfos) 
    { 
     if (obj == null) 
      return ""; 

     var builder = new StringBuilder(); 

     for (var i = 0; i < propertyInfos.Count; i++) 
     { 
      builder.Append(propertyInfos[i].GetValue(obj, null)); 

      if (i < propertyInfos.Count - 1) 
       builder.Append(","); 
     } 

     return builder.ToString(); 
    } 
} 
0
string csv = ""; 
//get property names from the first object using reflection  
IEnumerable<PropertyInfo> props = entityObjects.First().GetType().GetProperties(); 

//header 
csv += String.Join(", ",props.Select(prop => prop.Name)) + "\r\n"; 

//rows 
foreach(var entityObject in entityObjects) 
{ 
    csv += String.Join(", ", props.Select(
     prop => (prop.GetValue(entityObject, null) ?? "").ToString() 
    )) 
    + "\r\n"; 
} 
  • wäre besser, Stringbuilder zu verwenden für viele Entitys
  • Der Code nicht für überprüfen, wenn entityObjects ist leer