J'écris une application d'importation simple et j'ai besoin de lire un fichier CSV, d'afficher le résultat dans un DataGrid
et d'afficher les lignes corrompues du fichier CSV dans une autre grille. Par exemple, affichez les lignes plus courtes que 5 valeurs dans une autre grille. J'essaye de faire ça comme ça:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
mais il est très difficile d'opérer sur des tableaux dans ce cas. Existe-t-il une meilleure façon de diviser les valeurs?
Réponses:
Ne réinventez pas la roue. Tirez parti de ce qui existe déjà dans .NET BCL.
Microsoft.VisualBasic
(oui, cela dit VisualBasic mais cela fonctionne aussi bien en C # - rappelez-vous qu'à la fin, tout est juste IL)Microsoft.VisualBasic.FileIO.TextFieldParser
classe pour analyser le fichier CSVVoici l exemple de code:
Cela fonctionne très bien pour moi dans mes projets C #.
Voici quelques liens / informations supplémentaires:
la source
TextFieldParser
et ça a fait l'affaire. Merciparser.TextFieldType = FieldType.Delimited;
n'est pas nécessaire si vous appelezparser.SetDelimiters(",");
, car la méthode définit laTextFieldType
propriété pour vous."text with quote"", and comma"
, et vous pouvez obtenir la valeur correctetext with quote", and comma
au lieu de valeurs mal séparées. Vous pouvez donc opter pour String.Split si vous csv est très simple.Mon expérience est qu'il existe de nombreux formats csv différents. Surtout comment ils gèrent l'échappement des guillemets et des délimiteurs dans un champ.
Voici les variantes que j'ai rencontrées:
J'ai essayé de nombreux analyseurs csv existants, mais il n'y en a pas un seul qui puisse gérer les variantes que j'ai rencontrées. Il est également difficile de trouver dans la documentation quelles variantes échappantes supportées par les analyseurs.
Dans mes projets, j'utilise maintenant le VB TextFieldParser ou un séparateur personnalisé.
la source
Je recommande CsvHelper de Nuget .
(L'ajout d'une référence à Microsoft.VisualBasic ne semble pas juste, ce n'est pas seulement moche, ce n'est probablement même pas multi-plateforme.)
la source
CsvHelper
vient avec une ligne intégrée au mappeur de classe; il permet des variations dans les en-têtes de colonne (si présents), et même apparemment des variations dans l'ordre des colonnes (bien que je n'ai pas testé ce dernier moi-même). Dans l'ensemble, cela semble beaucoup plus "de haut niveau" queTextFieldParser
.Parfois, l'utilisation de bibliothèques est cool lorsque vous ne voulez pas réinventer la roue, mais dans ce cas, on peut faire le même travail avec moins de lignes de code et plus facile à lire que l'utilisation de bibliothèques. Voici une approche différente que je trouve très simple à utiliser.
la source
CSV peut devenir très vite compliqué .
Utilisez quelque chose de robuste et bien testé:
FileHelpers: www.filehelpers.net
la source
J'utilise ceci ici:
http://www.codeproject.com/KB/database/GenericParser.aspx
La dernière fois que je cherchais quelque chose comme ça, je l'ai trouvé comme réponse à cette question .
la source
Un autre sur cette liste, Cinchoo ETL - une bibliothèque open source pour lire et écrire des fichiers CSV
Pour un exemple de fichier CSV ci-dessous
Vous pouvez les charger rapidement en utilisant la bibliothèque comme ci-dessous
Si vous avez une classe POCO correspondant au fichier CSV
Vous pouvez l'utiliser pour charger le fichier CSV comme ci-dessous
Veuillez consulter les articles de CodeProject sur la façon de l'utiliser.
Avertissement: je suis l'auteur de cette bibliothèque
la source
la source
Tout d'abord, il faut comprendre ce qu'est CSV et comment l'écrire.
/r/n
) est la prochaine ligne de "table".\t
ou,
/r/n
sybols (la cellule doit commencer par le symbole des guillemets et se termine par ce symbole dans ce cas)Le moyen le plus simple pour C # / Visual Basic de travailler avec des fichiers CSV consiste à utiliser une
Microsoft.VisualBasic
bibliothèque standard . Il vous suffit d'ajouter la référence nécessaire et la chaîne suivante à votre classe:Oui, vous pouvez l'utiliser en C #, ne vous inquiétez pas. Cette bibliothèque peut lire des fichiers relativement volumineux et prend en charge toutes les règles nécessaires, vous pourrez donc travailler avec tous les fichiers CSV.
Il y a quelque temps, j'avais écrit une classe simple pour la lecture / écriture CSV basée sur cette bibliothèque. En utilisant cette classe simple, vous pourrez travailler avec CSV comme avec un tableau à 2 dimensions. Vous pouvez trouver ma classe par le lien suivant: https://github.com/ukushu/DataExporter
Exemple simple d'utilisation:
la source
Pour compléter les réponses précédentes, on peut avoir besoin d'une collection d'objets de son fichier CSV, soit analysés par
TextFieldParser
lastring.Split
méthode ou par la méthode, puis chaque ligne convertie en objet via Reflection. Vous devez évidemment d'abord définir une classe qui correspond aux lignes du fichier CSV.J'ai utilisé le simple sérialiseur CSV de Michael Kropat trouvé ici: Classe générique en CSV (toutes les propriétés) et réutilisé ses méthodes pour obtenir les champs et les propriétés de la classe souhaitée.
Je désérialise mon fichier CSV avec la méthode suivante:
la source
Je suggère fortement d'utiliser CsvHelper.
Voici un exemple rapide:
La documentation complète peut être trouvée à: https://joshclose.github.io/CsvHelper
la source