将CSV数据导入C#类
我知道如何阅读和显示.csv文件的一行。 现在我想解析该文件,将其内容存储在数组中,并将这些数组用作我创建的某些类的值。
我想学习如何。
这是一个例子:
basketball,2011/01/28,Rockets,Blazers,98,99 baseball,2011/08/22,Yankees,Redsox,4,3
如您所见,每个字段用逗号分隔。 我创建了Basketball.cs和Baseball类,它是Sport.cs类的扩展,它包含以下字段:
private string sport; private string date; private string team1; private string team2; private string score;
我理解这是简单的,并且有更好的方法来存储这些信息,即为每个团队创建类,使日期成为DateType数据类型,以及更多相同但我想知道如何将此信息输入到类。
我假设这与getter和setter有关…我也读过字典和集合,但我想通过将它们全部存储在数组中来开始简单…(如果这有意义.. 。随意纠正我)。
这是我到目前为止所拥有的。 它所做的就是阅读csv并在控制台上鹦鹉学舌:
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 <>)。
您还可以向接受数组的Sport Class添加构造函数(如上面的答案中所述的拆分操作的结果)。
此外,您可以在setter中提供一些转换
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]); }
为简单起见,我编写了转换方法,但请记住,这也不是一种非常安全的方法,除非您确定DateField始终包含有效日期,并且分数始终包含数字值。 您可以尝试其他更安全的方法,如tryParse或一些exception处理。
我很诚实,它必须补充说上述解决方案很简单(根据要求),在概念层面我会建议反对它。 将属性和csv文件之间的映射逻辑放在类中会使体育类过于依赖文件本身,从而减少可重用性。 然后,文件结构中的任何后续更改都应反映在您的课程中,并且通常会被忽略。 因此,将“映射和转换”逻辑放在主程序中并尽可能保持您的类清洁会更明智
(通过将其格式化为2个字符串并结合连字符来更改“分数”问题)
将sting拆分为数组以获取数据可能容易出错且速度慢。 尝试使用OLE数据提供程序读取CSV,就好像它是SQL数据库中的表一样,这样您就可以使用WHERE子句来过滤结果。
App.Config中 <?xml version =“1.0”encoding =“utf-8”?> <结构>节点 节点 配置> Program.cs中using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OleDb; using System.Configuration; using System.Data; using System.Data.Common; namespace CsvImport { class Stat { public string Sport { get; set; } public DateTime Date { get; set; } public string TeamOne { get; set; } public string TeamTwo { get; set; } public int Score { get; set; } } class Program { static void Main(string[] args) { ConnectionStringSettings csv = ConfigurationManager.ConnectionStrings["csv"]; List stats = new List(); using (OleDbConnection cn = new OleDbConnection(csv.ConnectionString)) { cn.Open(); using (OleDbCommand cmd = cn.CreateCommand()) { cmd.CommandText = "SELECT * FROM [Stats.csv]"; cmd.CommandType = CommandType.Text; using (OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { int fieldSport = reader.GetOrdinal("sport"); int fieldDate = reader.GetOrdinal("date"); int fieldTeamOne = reader.GetOrdinal("teamone"); int fieldTeamTwo = reader.GetOrdinal("teamtwo"); int fieldScore = reader.GetOrdinal("score"); foreach (DbDataRecord record in reader) { stats.Add(new Stat { Sport = record.GetString(fieldSport), Date = record.GetDateTime(fieldDate), TeamOne = record.GetString(fieldTeamOne), TeamTwo = record.GetString(fieldTeamTwo), Score = record.GetInt32(fieldScore) }); } } } } foreach (Stat stat in stats) { Console.WriteLine("Sport: {0}", stat.Sport); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.OleDb; using System.Configuration; using System.Data; using System.Data.Common; namespace CsvImport { class Stat { public string Sport { get; set; } public DateTime Date { get; set; } public string TeamOne { get; set; } public string TeamTwo { get; set; } public int Score { get; set; } } class Program { static void Main(string[] args) { ConnectionStringSettings csv = ConfigurationManager.ConnectionStrings["csv"]; List stats = new List(); using (OleDbConnection cn = new OleDbConnection(csv.ConnectionString)) { cn.Open(); using (OleDbCommand cmd = cn.CreateCommand()) { cmd.CommandText = "SELECT * FROM [Stats.csv]"; cmd.CommandType = CommandType.Text; using (OleDbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { int fieldSport = reader.GetOrdinal("sport"); int fieldDate = reader.GetOrdinal("date"); int fieldTeamOne = reader.GetOrdinal("teamone"); int fieldTeamTwo = reader.GetOrdinal("teamtwo"); int fieldScore = reader.GetOrdinal("score"); foreach (DbDataRecord record in reader) { stats.Add(new Stat { Sport = record.GetString(fieldSport), Date = record.GetDateTime(fieldDate), TeamOne = record.GetString(fieldTeamOne), TeamTwo = record.GetString(fieldTeamTwo), Score = record.GetInt32(fieldScore) }); } } } } foreach (Stat stat in stats) { Console.WriteLine("Sport: {0}", stat.Sport); } } } }
编辑
我忘了展示csv应该如何看:)
stats.csv 体育,日期,teamone,teamtwo的,得分 篮球,28/01/2011,火箭,运动上衣,98 棒球,22/08/2011,洋基,红袜队,4
虽然有很多库可以使csv读取变得容易(参见: 这里 ),但是现在你需要做的就是分割它。
String[] csvFields = line.Split(",");
现在将每个字段分配给适当的成员
sport = csvFields[0]; date = csvFields[1]; //and so on
但是,每次读取新行时都会覆盖这些值,因此需要将值打包到类中,并将该类的实例保存到列表中。
// use "Microsoft.VisualBasic.dll" using System; using Microsoft.VisualBasic.FileIO; class Program { static void Main(string[] args){ using(var csvReader = new TextFieldParser(@"sportsResults.csv")){ csvReader.SetDelimiters(new string[] {","}); string [] fields; while(!csvReader.EndOfData){ fields = csvReader.ReadFields(); Console.WriteLine(String.Join(",",fields));//replace make instance } } } }
下面是新手和引人注目的解决方案,大多数新手喜欢尝试和错误请不要忘记在.cs文件中的引用导入命名空间中添加System.Core.dll:using System.Linq;
也许添加迭代器将是更好的代码
private static IEnumerable GetDataPerLines() { FileStream aFile = new FileStream("sportsResults.csv",FileMode.Open); StreamReader sr = new StreamReader(aFile); while ((line = sr.ReadLine()) != null) { yield return line; } sr.Close(); } static void Main(string[] args) { var query = from data in GetDataPerLines() let splitChr = data.Split(",".ToCharArray()) select new Sport { sport = splitChr[0], date = splitChr[1],.. and so on } foreach (var item in query) { Console.Writeline(" Sport = {0}, in date when {1}",item.sport,item.date); } }
也许是这样,上面的示例是使用yield创建自己的迭代(请查看MSDN文档)并根据您的字符串创建集合。
如果我写代码错误,请告诉我,因为我没有;当我写答案时,我有Visual Studio。 根据您的了解,像“Sport []”这样的数组一维将转换为CLR IEnumerable
上述就是C#学习教程:将CSV数据导入C#类分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/990242.html