Is there a quick way to convert an entity to .csv file?

前端 未结 3 1351
一生所求
一生所求 2021-02-03 12:28

at present, I have:

        string outputRow = string.Empty;
        foreach (var entityObject in entityObjects)
        {
            outputRow = entityObject.f         


        
相关标签:
3条回答
  • 2021-02-03 12:44

    Sample code that shows a simple yet powerful way of accomplishing what you want with no need to hard code property names (using reflection):

     /// <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();
     }
    

    More on this:

    Objects to CSV

    How can i convert a list of 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

    0 讨论(0)
  • 2021-02-03 12:44

    I took Leniel's suggestion and wrapped it up in a full featured "writer" that also allows you to filter the properties you want written. Here's the code for your usage:

    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 讨论(0)
  • 2021-02-03 12:45
    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";
    }
    
    • Would be better to use StringBuilder for lots of entitys
    • The code doesn't check for when entityObjects is empty
    0 讨论(0)
提交回复
热议问题