2017-06-20 83 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。 它不能序列化數組,但很容易實現。