Le moyen le plus rapide de convertir une liste d'objets en csv avec chaque valeur d'objet dans une nouvelle ligne
J'ai une classe comme suit :
public class Test
{
public int Id {get;set;}
public string Name { get; set; }
public string CreatedDate {get;set;}
public string DueDate { get; set; }
public string ReferenceNo { get; set; }
public string Parent { get; set; }
}
et j'ai une liste d'objets de Test
List<Test>testobjs=new List();
Maintenant, je voudrais le convertir en csv au format suivant:
"1,John Grisham,9/5/2014,9/5/2014,1356,0\n2,de Stephen King,9/3/2014,9/9/2014,1367,0\n3,Le faiseur de pluie,4/9/2014,18/9/2014,1";
Je recherche pour "liste de Conversion de csv c#" et j'ai obtenu des solutions comme suit:
string.Join(",", list.Select(n => n.ToString()).ToArray())
Mais cela ne mettra pas les \n en tant que de besoin je.e pour chaque objet
Est-il de toute façon la plus rapide d'autre que de la chaîne de construction pour ce faire? S'il vous plaît aider...
source d'informationauteur PassionateProgrammer
Vous devez vous connecter pour publier un commentaire.
Utilisation servicestack.texte
puis utilisez la chaîne des méthodes d'extension
ToCsv(T)/FromCsv()
Exemples:
https://github.com/ServiceStack/ServiceStack.Text
Mise à jour:
Servicestack.Text
est maintenant libre aussi dans la v4 qui a utilisé pour être commercial. Pas besoin de spécifier la version plus! Heureux de la sérialisation!Mise à jour:
Utilisation
ServiceStack.Text.Core
pour .NET de Base.Parce que la vitesse a été mentionné dans la question, mon intérêt a été piqué sur tout ce que les performances relatives de l'être, et à quelle vitesse je pouvais le faire.
Je sais que StringBuilder a été exclu, mais il se sentait toujours comme probablement le plus rapide, et StreamWriter a bien sûr l'avantage d'écrire à un MemoryStream ou directement dans un fichier, ce qui le rend polyvalent.
Donc j'ai frappé un test rapide.
J'ai construit une liste d'un demi-million d'objets identiques à la vôtre.
Puis je sérialisé avec CsvSerializer, et avec deux roulés à la main serrée versions, l'une à l'aide d'un StreamWriter pour un MemoryStream et l'autre à l'aide d'un StringBuilder.
Le roulé à la main de code, le code à composer avec des guillemets, mais rien de plus sophistiqué. Ce code était très serré avec le minimum que je pouvais gérer intermédiaire de chaînes, pas de concaténation... mais pas pour la production et certainement pas de points pour le style ou la flexibilité.
Mais le résultat était identique dans les trois méthodes.
Les timings étaient intéressantes:
De la sérialisation d'un demi-million d'objets, cinq pistes avec chaque méthode, toutes les heures à l'entier le plus proche mS:
C'était sur un haut de gamme i7 avec beaucoup de RAM.
Autres choses étant égales par ailleurs, je serais toujours utiliser la bibliothèque.
Mais si de 2:1 différence de performance est devenue critique, ou si la RAM ou d'autres problèmes, s'est avéré à exagérer la différence sur un plus grand ensemble de données, ou si les données ont été arrivant en morceaux et devait être envoyé directement sur le disque, je pourrais juste être tenté...
Juste au cas où ça intéresse quelqu'un, le noyau du code (pour le StringBuilder version) a été
Votre meilleure option serait d'utiliser une bibliothèque existante. Il vous permet d'économiser les tracas d'essayer de le comprendre vous-même et il sera probablement traiter avec l'échappement des caractères spéciaux, en ajoutant des lignes d'en-tête, etc.
Vous pouvez utiliser le CSVSerializer de ServiceStack. Mais il existe plusieurs autres dans nuget.
La création du fichier CSV sera alors aussi facile que
string csv = CsvSerializer.SerializeToCsv(testobjs);
LINQtoCSV est la manière la plus rapide et la plus légère que j'ai trouvé et est disponible sur GitHub. Vous permet de spécifier des options via les attributs de la propriété.
Utilisation Cinchoo ETL
ou
Exemple montre comment utiliser
De sortie CSV:
Pour plus d'informations, allez à la github
https://github.com/Cinchoo/ChoETL