Convertir efficacement des DataTables en fichiers CSV en C#
Transformer un DataTable en fichier CSV est une opération fréquente en informatique. Cependant, une mauvaise manipulation peut entraîner une corruption des données, entraînant souvent des valeurs concaténées dans la première cellule de chaque ligne. Ce guide montre la bonne approche, en évitant les pièges courants.
Résolution des erreurs courantes :
Une erreur courante consiste à ajouter des virgules supplémentaires à la fin de chaque ligne, ce qui entraîne un désalignement des données. Cet exemple évite ce problème.
Mise en œuvre optimale :
Pour .NET 4.0 et versions ultérieures :
Cet extrait de code optimisé convertit efficacement un DataTable en fichier CSV :
<code class="language-csharp">StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Join(",", dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName))); foreach (DataRow row in dt.Rows) { IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString()); sb.AppendLine(string.Join(",", fields)); } File.WriteAllText("test.csv", sb.ToString());</code>
Gestion des caractères spéciaux (par exemple, des virgules dans les champs) :
Pour éviter la corruption des données causée par des caractères spéciaux tels que des virgules dans les champs de données, utilisez cette méthode améliorée :
<code class="language-csharp">foreach (DataRow row in dt.Rows) { IEnumerable<string> fields = row.ItemArray.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")); sb.AppendLine(string.Join(",", fields)); }</code>
Ce code entoure chaque champ entre guillemets doubles et échappe à tous les guillemets doubles existants dans les champs.
Gestion améliorée de la mémoire : écriture ligne par ligne :
Pour les DataTables extrêmement volumineux, l'écriture du CSV ligne par ligne améliore l'efficacité de la mémoire :
<code class="language-csharp">using (var writer = new StreamWriter("test.csv")) { writer.WriteLine(string.Join(",", dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName))); foreach (DataRow row in dt.Rows) { writer.WriteLine(string.Join(",", row.ItemArray.Select(field => string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\"")))); } }</code>
Cette approche évite de charger l'intégralité du CSV en mémoire en une seule fois, ce qui le rend adapté à la gestion d'ensembles de données volumineux. N'oubliez pas d'inclure les déclarations using
nécessaires pour System.Data
, System.IO
, System.Linq
et System.Text
.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!