2017-06-20 82 views
-1

是否有任何库可以将具有数组属性的对象序列化为.csv?使用字符串[]属性将对象转换为CSV或Excel

比方说,我有这样的模式:

public class Product 
{ 
    public string ProductName { get; set; } 
    public int InStock { get; set; } 
    public double Price { get; set; } 
    ... 
    public string[] AvailableVariants { get; set; } 
} 

将这样的事情是可能的吗?

编辑:我需要以csv/excel格式显示一些数据。问题是,我不确定是否有一种简单的方法可以实现我想要的CSV序列化库,或者我应该专注于编写一个Excel本机文件。

我要找的结果的一个例子:

Product Name In Stock Price Variants 
ABC 241 200 Normal 
CAB 300 300 Normal 
      Red 
      Blue 
CBA 125 100 Normal 
      White 
      Awesome 
      Red 
ACB 606 75 Normal 
      Small 
      Large 
      X-Large 

什么是做到这一点的最有效方法是什么?

+3

Google对此有何评论? –

+0

[duplicateated]检查https://stackoverflow.com/questions/25683161/fastest-way-to-convert-a-list-of-objects-to-csv-with-each-object-values-in-a-new – msd

+3

的[给对象的列表转换成CSV与每个对象的值在一个新行的最快方法](可能的复制https://stackoverflow.com/questions/25683161/fastest-way-to-convert-a-list-of -objects到CSV与 - 每个对象值-IN-A-新) –

回答

0

我不知道会做到这一点任何库,这里是我怎么想靠近写入/从CSV阅读控制台例如:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 

namespace TestingProduct 
{ 
    class TestingProduct 
    { 
     public class Product 
     { 
      public string ProductName { get; set; } 
      public int InStock { get; set; } 
      public double Price { get; set; } 
      public string[] AvailableVariants { get; set; } 

      public override string ToString() => $"{ProductName},{InStock},{Price}{(AvailableVariants?.Length > 0 ? "," + string.Join(",", AvailableVariants) : "")}"; 

      public static Product Parse(string csvRow) 
      { 
       var fields = csvRow.Split(','); 

       return new Product 
       { 
        ProductName = fields[0], 
        InStock = Convert.ToInt32(fields[1]), 
        Price= Convert.ToDouble(fields[2]), 
        AvailableVariants = fields.Skip(3).ToArray() 
       }; 
      } 
     } 

     static void Main() 
     { 
      var prod1 = new Product 
      { 
       ProductName = "test1", 
       InStock= 2, 
       Price = 3, 
       AvailableVariants = new string[]{ "variant1", "variant2" } 
      }; 

      var filepath = @"C:\temp\test.csv"; 
      File.WriteAllText(filepath, prod1.ToString()); 

      var parsedRow = File.ReadAllText(filepath); 
      var parsedProduct = Product.Parse(parsedRow); 
      Console.WriteLine(parsedProduct); 

      var noVariants = new Product 
      { 
       ProductName = "noVariants", 
       InStock = 10, 
       Price = 10 
      }; 

      var prod3 = new Product 
      { 
       ProductName = "test2", 
       InStock= 5, 
       Price = 5, 
       AvailableVariants = new string[] { "variant3", "variant4" } 
      }; 

      var filepath2 = @"C:\temp\test2.csv"; 
      var productList = new List<Product> { parsedProduct, prod3, noVariants }; 
      File.WriteAllText(filepath2, string.Join("\r\n", productList.Select(x => x.ToString()))); 

      var csvRows = File.ReadAllText(filepath2); 

      var newProductList = new List<Product>(); 
      foreach (var csvRow in csvRows.Split(new string[] { "\r\n" }, StringSplitOptions.None)) 
      { 
       newProductList.Add(Product.Parse(csvRow)); 
      } 
      newProductList.ForEach(Console.WriteLine); 

      Console.ReadKey(); 
     } 
    } 
} 

该代码将有一类工作一个对象数组属性。你是否需要一些可以处理具有多个数组属性的对象?

+0

所以,基本上它只是放在列中的变体,这很方便。不幸的是,我还不确定模型类中是否有更多的数组字段。我仍然在搞清楚细节。 – Reynevan

+0

如果您将要有多个arary字段,您需要将它们设置为静态大小,则只能有一个动态大小的数组,它将是最后一个输出(就像方法调用中的param string []属性一样) – wentimo

0

我已经写了一些类库来写CSV文件,看看:

public static class CsvSerializer 
{ 
    public static bool Serialize<T>(string path, IList<T> data, string delimiter = ";") 
    { 
    var csvBuilder = new StringBuilder(); 
    var dataType = typeof(T); 
    var properties = dataType.GetProperties() 
          .Where(prop => prop.GetCustomAttribute(typeof(CsvSerialize)) == null); 

    //write header 
    foreach (var property in properties) 
    { 
     csvBuilder.Append(property.Name); 
     if (property != properties.Last()) 
     { 
     csvBuilder.Append(delimiter); 
     } 
    } 
    csvBuilder.Append("\n"); 
    //data 
    foreach (var dataElement in data) 
    { 
    foreach (var property in properties) 
    { 
     csvBuilder.Append(property.GetValue(dataElement)); 
     if (property != properties.Last()) 
     { 
     csvBuilder.Append(delimiter); 
     } 
    } 
    csvBuilder.Append("\n"); 
    } 

    File.WriteAllText(path, csvBuilder.ToString()); 

    return true; 
} 
} 

public class CsvSerialize : Attribute 
{ 
} 

让我们假装要序列下面的类:

public class MyDataClass 
{ 
    [CsvSerialize] 
    public string Item1 {get; set;} 
    [CsvSerialize] 
    public string Item2 {get; set;} 
} 

然后,只需做:

public void SerializeData(IList<MyDataClass> data) 
{ 
    CsvSerializer.Serialize("C:\\test.csv", data); 
} 

它需要你的类的IList并写入一个csv。 它不能序列化数组,但很容易实现。