J'essaie d'écrire dans un csv
fichier ligne par ligne en utilisant le langage C #. Voici ma fonction
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
La fonction entière s'exécute dans une boucle et chaque ligne doit être écrite dans le csv
fichier. Dans mon cas, la ligne suivante écrase la ligne existante et à la fin, j'obtiens un seul enregistrement unique dans le fichier csv qui est le dernier. Comment puis-je écrire toutes les lignes du csv
fichier?
StringBuilder
, puis faire une sauvegarde?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Réponses:
METTRE À JOUR
À l'époque naïve, j'ai suggéré de le faire manuellement (c'était une solution simple à une question simple), mais en raison de cette popularité croissante , je recommanderais d'utiliser la bibliothèque CsvHelper qui effectue tous les contrôles de sécurité, etc.
Le CSV est beaucoup plus compliqué que ce que la question / réponse suggère.
Réponse originale
Comme vous avez déjà une boucle, envisagez de le faire comme ceci:
Ou quelque chose à cet effet. Mon raisonnement est le suivant: vous n'aurez pas besoin d'écrire dans le fichier pour chaque élément, vous n'ouvrirez le flux qu'une seule fois, puis vous y écrivez.
Vous pouvez remplacer
avec
si vous souhaitez conserver les versions précédentes de csv dans le même fichier
C # 6
Si vous utilisez c # 6.0, vous pouvez effectuer les opérations suivantes
ÉDITER
Voici un lien vers une question qui explique ce que cela
Environment.NewLine
fait.la source
{2}
etEnvironment.NewLine
et utiliser à laAppendLine
place deAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
au lieu de virgule.Je vous recommande fortement d'emprunter la voie la plus fastidieuse. Surtout si la taille de votre fichier est importante.
File.AppendAllText()
ouvre un nouveau fichier, écrit le contenu, puis ferme le fichier. L'ouverture de fichiers est une opération beaucoup plus gourmande en ressources que l'écriture de données dans un flux ouvert. L'ouverture / la fermeture d'un fichier dans une boucle entraînera une baisse des performances.L'approche suggérée par Johan résout ce problème en stockant toutes les sorties en mémoire, puis en les écrivant une fois. Cependant (en cas de gros fichiers), votre programme consommera une grande quantité de RAM et même plantera avec
OutOfMemoryException
Un autre avantage de ma solution est que vous pouvez implémenter une pause \ reprise en enregistrant la position actuelle dans les données d'entrée.
upd. Placé en utilisant au bon endroit
la source
using
instruction. Sinon, vous allez rouvrir le fichier tout le temps encore et encore.Écrire des fichiers csv à la main peut être difficile car vos données peuvent contenir des virgules et des retours à la ligne. Je vous suggère d'utiliser une bibliothèque existante à la place.
Cette question mentionne quelques options.
Existe-t-il des bibliothèques de lecture / écriture CSV en C #?
la source
J'utilise une solution à deux analyses car elle est très facile à entretenir
la source
File.AppendAllLines(filePath, lines, Encoding.ASCII);
place deFile.WriteAllText(filePath, csv.ToString());
Donc, je fais quelque chose de très maladroit. Après avoir construit le csv à l'aide de StringBuilder, je le convertis en List <string> pour obtenir un IEnumerable pour l'appel à AppendAllLines, qui n'acceptera pas csv.ToString () comme paramètre:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
Avez-vous une meilleure façon de procéder?Au lieu d'appeler à chaque fois,
AppendAllText()
vous pourriez penser à ouvrir le fichier une fois, puis à écrire tout le contenu une fois:la source
Utilisez simplement AppendAllText à la place:
Le seul inconvénient de AppendAllText est qu'il générera une erreur lorsque le fichier n'existe pas, donc cela doit être vérifiéDésolé, moment blond avant de lire la documentation . Quoi qu'il en soit, la méthode WriteAllText écrase tout ce qui a été précédemment écrit dans le fichier, si le fichier existe.
Notez que votre code actuel n'utilise pas de nouvelles lignes appropriées, par exemple dans le Bloc-notes, vous verrez tout cela comme une longue ligne. Changez le code en ceci pour avoir de nouvelles lignes appropriées:
la source
Au lieu de réinventer la roue, une bibliothèque pourrait être utilisée.
CsvHelper
est idéal pour créer et lire des fichiers csv. Ses opérations de lecture et d'écriture sont basées sur des flux et prennent donc également en charge les opérations avec une grande quantité de données.Vous pouvez écrire votre csv comme suit.
Comme la bibliothèque utilise la réflexion, elle prendra n'importe quel type et l'analysera directement.
Si vous souhaitez en savoir plus sur les configurations et les possibilités des bibliothèques, vous pouvez le faire ici .
la source
la source
.Replace(",", ";") + ','
:?Gestion des virgules
Pour gérer les virgules à l'intérieur des valeurs lors de l'utilisation
string.Format(...)
, ce qui suit a fonctionné pour moi:Donc, pour le combiner avec la réponse de Johan, cela ressemblerait à ceci:
Retour du fichier CSV
Si vous vouliez simplement retourner le fichier au lieu de l'écrire dans un emplacement, voici un exemple de la façon dont je l'ai accompli:
À partir d'une procédure stockée
À partir d'une liste
J'espère que cela vous sera utile.
la source
Il s'agit d'un didacticiel simple sur la création de fichiers csv à l'aide de C # que vous pourrez modifier et développer pour répondre à vos propres besoins.
Vous devez d'abord créer une nouvelle application console Visual Studio C #, il existe des étapes à suivre pour ce faire.
L'exemple de code créera un fichier csv appelé MyTest.csv à l'emplacement que vous spécifiez. Le contenu du fichier doit être composé de 3 colonnes nommées avec du texte dans les 3 premières lignes.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
la source
Vous devrez peut-être simplement ajouter un saut de ligne
"\n\r"
.la source
Voici une autre bibliothèque open source pour créer facilement un fichier CSV, Cinchoo ETL
Pour plus d'informations, veuillez lire l' article CodeProject sur l'utilisation.
la source
Un moyen simple de se débarrasser du problème d'écrasement consiste
File.AppendText
à ajouter une ligne à la fin du fichierla source
string string_value = string.Empty;
la source
Cela devrait vous permettre d'écrire un fichier csv tout simplement. Usage:
la source