L'importation de données au format CSV, en classes C#
Je sais comment lire et afficher une ligne de une .fichier csv. Je voudrais maintenant analyser ce fichier, stocker son contenu dans des tableaux, et l'utilisation de ces tableaux comme des valeurs pour certaines classes que j'ai créé.
Je voudrais savoir comment bien.
Voici un exemple:
basketball,2011/01/28,Rockets,Blazers,98,99
baseball,2011/08/22,Yankees,Redsox,4,3
Comme vous pouvez le voir, chaque champ est séparé par des virgules. J'ai créé le Basket-ball.cs de Baseball et de classes, qui est une extension de ce Sport.cs de la classe, qui a les champs:
private string sport;
private string date;
private string team1;
private string team2;
private string score;
Je comprends que c'est simpliste, et qu'il y a de meilleures façons de stocker cette info, c'est à dire de la création de classes pour chaque équipe, de prendre de la date de DateType type de données, et plus de la même chose mais j'aimerais savoir comment entrer cette information dans les classes.
Je suppose que cela a quelque chose à faire avec les getters et les setters... j'ai aussi lu des dictionnaires et des collections, mais j'aimerais commencer simplement par les stocker dans des tableaux... (Si cela fait sens... hésitez pas à me corriger).
Voici ce que j'ai jusqu'à présent. Il n'est de lire le csv et le perroquet de son contenu sur la Console:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace Assign01
{
class Program
{
static void Main(string[] args)
{
string line;
FileStream aFile = new FileStream("../../sportsResults.csv", FileMode.Open);
StreamReader sr = new StreamReader(aFile);
//read data in line by line
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
line = sr.ReadLine();
}
sr.Close();
}
}
}
Aide serait grandement appréciée.
OriginalL'auteur iggy2012 | 2011-10-09
Vous devez vous connecter pour publier un commentaire.
Création de matrice de garder l'information n'est pas une très bonne idée, car vous ne savez pas le nombre de lignes dans le fichier d'entrée. Quelle serait la taille initiale de votre Tableau ?? Je vous conseille d'utiliser par exemple une Liste Générique de garder l'information (E. g. Liste<>).
Vous pouvez également ajouter un constructeur à votre Sport de Classe qui accepte un tableau (suite de la scission de l'action, comme décrit dans la réponse ci-dessus.
En outre, vous pouvez fournir certaines conversions dans les poseurs de
Juste pour des raisons de simplicité, j'ai écrit le Convertir Méthode, mais gardez à l'esprit que c'est aussi un moyen très sûr, sauf si vous êtes sûr que le DateField contient toujours des Dates de validité et le Score contient toujours des Valeurs Numériques. Vous pouvez essayer d'autres méthodes plus sûres comme tryParse ou certaines de gestion des exceptions.
J'ai toute honnêteté, il faut ajouter que la solution ci-dessus est simple (comme demandé), sur un plan conceptuel, je ne vous le conseille. Mettre la logique de mapping entre les attributs et le fichier csv dans la classe va faire la classe sport trop dépendant sur le fichier lui-même et donc de moins en moins réutilisables. Tout changement ultérieur dans la structure du fichier doit ensuite être prises en compte dans votre classe et peut souvent être négligée. Par conséquent, il serait plus sage de mettre votre “cartographie & conversion” de la logique dans le programme principal et de garder votre classe le plus propre possible
(Changé votre "Score" problème de mise en forme 2 chaînes combiné avec un trait d'union)
OriginalL'auteur tazyDevel
le fractionnement de la piqûre dans les tableaux pour obtenir les données peuvent être sujettes à erreur et lent. Essayez d'utiliser un fournisseur de données OLE de lire le fichier CSV comme si c'était une table dans une base de données SQL, de cette façon, vous pouvez utiliser une clause where pour filtrer les résultats.
modifier
J'ai oublié de montrer comment le csv devrait ressembler 🙂
OriginalL'auteur Robert
Bien qu'il existe beaucoup de bibliothèques qui fera csv lecture facile (voir: ici), tout ce que vous devez faire maintenant que vous avez la ligne, est de le découper.
D'assigner à chaque champ pour le membre approprié
Ce sera toutefois remplacer les valeurs existantes chaque fois que vous lisez une nouvelle ligne, alors vous avez besoin pour emballer les valeurs dans une classe et enregistrer les instances de cette classe à une liste.
Voir user936598 commentaire sur la façon dont la classe pourrait ressembler. Puis créer un
List<Sport> sports = new List<Sport>()
avant d'entrer dans le lop et l'utilisationsports.Add(new Sport(line.split(",")));
à ajouter dans la boucle.OriginalL'auteur Darcara
OriginalL'auteur BLUEPIXY
Ci-dessous pour les débutants et accrocheur de la solution que la plupart des débutant comme à l'essai et d'erreur
s'il vous plaît ne pas oublier d'ajouter System.Core.dll dans les références
Importer l'espace de noms dans votre .cs fichier : en utilisant le Système.Linq;
Peut-être ajouter un itérateur sera meilleur code
Peut-être comme ceci, l'exemple ci-dessus est la création de vos propres itération à l'aide de rendement (veuillez jeter un oeil à la documentation MSDN pour qu') et de créer une collection basée sur votre chaîne.
Laissez-moi savoir si j'écris le code de mal puisque je ne t ont Visual studio lorsque j'écris la réponse.
Pour votre connaissance, un tableau à une dimension comme "le Sport[]" va se traduire par CLR IEnumerable
OriginalL'auteur nickotech2000