2017-06-20 1 views
-1

Existe-t-il une bibliothèque qui peut sérialiser des objets avec des propriétés de tableau en .csv?Conversion d'objets avec des propriétés string [] en CSV ou Excel

Disons que j'ai ce modèle:

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

Would quelque chose comme ça possible de le faire? Editer: J'ai besoin de présenter certaines données dans un format CSV/Excel. La chose est, je ne suis pas sûr s'il y a un moyen simple de réaliser ce que je veux avec les bibliothèques de sérialisation CSV ou si je devrais plutôt me concentrer sur l'écriture d'un fichier natif Excel.

Un exemple de résultat que je cherche:

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 

Quelle serait la façon la plus efficace de le faire?

+3

Qu'est-ce que Google a dit à ce sujet? –

+0

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

+3

Possible duplicate of [Le moyen le plus rapide de convertir une liste d'objets en csv avec chaque valeur d'objet dans une nouvelle ligne] (https://stackoverflow.com/questions/25683161/fastest-way-to-convert-a-list-of -objects-to-csv-with-chaque-object-values-in-a-new) –

Répondre

0

Je ne suis pas au courant de toutes les bibliothèques qui le fera, voici un exemple de la console de la façon dont j'approche d'écriture/lecture d'un fichier 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(); 
     } 
    } 
} 

Ce code fonctionnera avec une classe qui a une seule propriété de tableau d'objets. Avez-vous besoin de quelque chose qui peut gérer un objet avec plusieurs propriétés de tableau?

+0

Donc, fondamentalement, il met simplement des variantes dans les colonnes, c'est pratique. Malheureusement je ne suis pas encore sûr si je n'aurai pas plus de champs de tableau dans la classe de modèle. Je suis toujours en train de déterminer les détails. – Reynevan

+0

Si vous devez avoir plusieurs champs arary, vous devez les rendre statiquement dimensionnés, vous ne pouvez avoir qu'un seul tableau de taille dynamique qui sera la dernière sortie (tout comme une propriété param string [] dans un appel de méthode) – wentimo

0

J'ai écrit une sorte de bibliothèque pour écrire des fichiers csv, un coup d'oeil:

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 
{ 
} 

Permet de faire semblant voulez sérialiser suivante classe:

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

Ensuite il suffit de faire:

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

Il prend un IList de votre classe et écrit un csv. Il ne peut pas sérialiser les tableaux, mais cela serait facile à mettre en œuvre.