将CSV数据导入C#类 [英] Importing CSV data into C# classes

查看:182
本文介绍了将CSV数据导入C#类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我,再回来一些更新的问题。

It's me again, back with some more newbie questions.

我知道如何读取和显示一行.csv文件...现在我想解析该文件,将其内容存储在数组中,并将这些数组用作我创建的一些类的值。

I know how to read and display a line of a .csv file... Now I would like to parse that file, store its contents in arrays, and use those arrays as values for some classes I created.

我想了解一下。

以下是一个例子:

basketball,2011/01/28,Rockets,Blazers,98,99
baseball,2011/08/22,Yankees,Redsox,4,3

如您所见,每个字段之间用逗号分隔。我创建了Basketball.cs和Baseball类,它是Sport.cs类的扩展,它有以下字段:

As you can see, each field is separated by commas. I've created the Basketball.cs and Baseball classes which is an extension of the Sport.cs class, which has the fields:

private string sport;
private string date;
private string team1;
private string team2;
private string score;



我理解这是简单的,并且有更好的方式来存储这个信息,每个团队,使日期为DateType数据类型,更多的是相同的,但我想知道如何将这些信息输入类。

I understand that this is simplistic, and that there's better ways of storing this info, i.e. creating classes for each team, making the date a DateType datatype, and more of the same but I'd like to know how to input this information into the classes.

我假设这与getters和setters有关...我也读过字典和集合,但我想开始简单存储他们所有在数组...(如果这是有道理...随意纠正我)。

I'm assuming this has something to do with getters and setters... I've also read of dictionaries and collections, but I'd like to start simple by storing them all in arrays... (If that makes sense... Feel free to correct me).

这是我到目前为止。它所做的是读取csv和parrot出其内容在控制台:

Here is what I have so far. All it does is read the csv and parrot out its contents on the 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();
        }
    }
}

推荐答案

创建数组来保存信息不是一个好主意,因为你不知道有多少行输入文件。什么是你的数组的初始大小?我建议你使用一个通用列表来保存信息(例如List<>)。

Creating array to keep the information is not a very good idea, as you don't know how many lines will be in the input file. What would be the initial size of your Array ?? I would advise you to use for example a Generic List to keep the information (E.g. List<>).

你也可以添加一个构造函数到你的运动类,

You can also add a constructor to your Sport Class that accepts an array (result of the split action as described in above answer.

此外,您可以在setter中提供一些转换

Additionally you can provide some conversions in the setters

public class Sport
{
    private string sport;
    private DateTime date;
    private string team1;
    private string team2;
    private string score;

    public Sport(string[] csvArray)
    {
        this.sport = csvArray[0];
        this.team1 = csvArray[2];
        this.team2 = csvArray[3];
        this.date = Convert.ToDateTime(csvArray[1]);
        this.score = String.Format("{0}-{1}", csvArray[4], csvArray[5]);
    }


$ b b

为了简单起见,我写了转换方法,但是请记住,这也不是一个非常安全的方法,除非你确定DateField总是包含有效的日期和分数总是包含数值。你可以尝试其他更安全的方法,如tryParse或一些异常处理。

Just for simplicity I wrote the Convert Method, but keep in mind this is also not a very safe way unless you are sure that the DateField always contains valid Dates and Score always contains Numeric Values. You can try other safer methods like tryParse or some Exception Handling.

我都诚实,它必须补充说,上述解决方案是简单的我建议反对。将属性和csv文件之间的映射逻辑放在类中将使得运动类太依赖于文件本身,因此不太可重用。任何后来的文件结构的更改都应该反映在你的类中,并且经常被忽略。因此,将你的映射&转换逻辑,并保持你的类干净尽可能

I all honesty, it must add that the above solution is simple (as requested), on a conceptual level I would advise against it. Putting the mapping logic between attributes and the csv-file in the class will make the sports-class too dependent on the file itself and thus less reusable. Any later changes in the file structure should then be reflected in your class and can often be overlooked. Therefore it would be wiser to put your "mapping & conversion" logic in the main program and keep your class a clean as possible

(通过格式化它的2个字符串结合连字符)

这篇关于将CSV数据导入C#类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆