Csharp/C#教程:将CSV数据导入C#类分享


将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

(0)
上一篇 2021年12月24日
下一篇 2021年12月24日

精彩推荐