42 votes

Écriture d'un fichier CSV en .net

J'ai besoin d'exporter un ensemble de données dans un fichier CSV.

J'ai passé un certain temps à chercher un ensemble de règles à suivre et je me suis rendu compte qu'il existe un certain nombre de règles et d'exceptions lors de l'écriture d'un fichier CSV.

http://knab.ws/blog/index.php?/archives/3-CSV-file-parser-and-writer-in-C-Part-1.html http://bytes.com/topic/c-sharp/answers/236875-problems-streamwriter-output-csv http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/0073fcbb-adab-40f0-b768-4bba803d3ccd

Maintenant, ce n'est pas un simple processus de séparation des chaînes de caractères avec des virgules, j'ai cherché un rédacteur CSV existant, soit d'une tierce partie, soit (espérons-le !) inclus dans le cadre .net.

Edit : Nouveau lien : http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-CSV-using-DynamicObject-and-TextFieldParser

Le TextFieldParser est un objet VB (qui peut être référencé à partir de C#) qui analyse automatiquement les fichiers CSV. :)

Je me demandais si quelqu'un connaissait des bibliothèques .Net (2.0 -> 3.5 et 4.0) pratiques pouvant être utilisées pour générer un fichier CSV correctement formaté.

De même, s'il existe des ensembles de règles pour la génération de fichiers CSV.

Il y a beaucoup de détails sur les lecteurs CSV et l'analyse des fichiers CSV, mais pas autant sur l'écriture (ok, je sais que c'est tout le contraire :P ).

http://www.codeproject.com/KB/database/CsvReader.aspx

Toute aide serait très appréciée :)

J'ai trouvé un autre article avec des règles CSV plus détaillées : http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm

Une bibliothèque tierce bien conçue est Linq-to-CSV (pas une bibliothèque de cadre) : http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Merci pour votre aide à tous. J'ai décidé que la meilleure solution sera de créer une simple classe statique qui fera le remplacement des caractères spéciaux (que Chris a mentionné).

Si j'avais besoin que Linq interroge mes fichiers CSV, je regarderais l'implémentation de Linq-to-CSV de CodeProjects.

Merci encore :)

49voto

Josh Close Points 4901

CsvHelper (une bibliothèque que je maintiens) également disponible via NuGet.

CsvHelper peut écrire automatiquement vos objets de classe dans un fichier pour vous.

var myObj = new MyCustomClass
{
    Prop1 = "one",
    Prop2 = 2
};
var streamWriter = // Create a writer to somewhere...
var csvWriter = new CsvWriter( streamWriter );

// You can write a single record.
csvWriter.WriteRecord( myObj );

// You can also write a collection of records.
var myRecords = new List<MyCustomClass>{ myObj };
csvWriter.WriteRecords( myRecords );

21voto

Chris Points 13472

S'il y a des virgules dans votre cellule, entourez la cellule entière de guillemets doubles, par exemple :

cell 1,cell 2,"This is one cell, even with a comma",cell4,etc

Et si vous voulez une double citation littérale, faites-en deux, par exemple :

cell 1,cell 2,"This is my cell and it has ""quotes"" in it",cell 4,etc

Pour les dates, respectez le format ISO et tout devrait bien se passer (par exemple, aaaa-mm-jj hh:mm:ss).

18voto

Richard Nienaber Points 5049

Je voudrais juste ajouter qu'il y a un RFC qui spécifie le format CSV qui est ce que je considère comme la source canonique.

6voto

lomaxx Points 32540

J'ai utilisé fichiers d'aide de manière extensive et c'est assez génial pour générer des CSVs.

4voto

Evgeny Gorb Points 118

Voici la fonction que vous pouvez utiliser pour générer une ligne de fichier CSV à partir d'une liste de chaînes (IEnumerable(Of String) ou un tableau de chaînes peuvent également être utilisés) :

Function CreateCSVRow(strArray As List(Of String)) As String
    Dim csvCols As New List(Of String)
    Dim csvValue As String
    Dim needQuotes As Boolean
    For i As Integer = 0 To strArray.Count() - 1
        csvValue = strArray(i)
        needQuotes = (csvValue.IndexOf(",", StringComparison.InvariantCulture) >= 0 _
                      OrElse csvValue.IndexOf("""", StringComparison.InvariantCulture) >= 0 _
                      OrElse csvValue.IndexOf(vbCrLf, StringComparison.InvariantCulture) >= 0)
        csvValue = csvValue.Replace("""", """""")
        csvCols.Add(If(needQuotes, """" & csvValue & """", csvValue))
    Next
    Return String.Join(",", csvCols.ToArray())
End Function

Comme je le pense, il ne sera pas difficile de passer de VB.NET à C#).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X