C#CSV到元组(或有用的数据类型)?

C#CSV到元组(或有用的数据类型)?,c#,csv,C#,Csv,我在一个学区工作,我们必须手动创建用户登录(AD)和GAFE帐户。我们希望尽可能实现自动化。目前,我们有一个每天从SIS(学生信息系统)导出的CSV文件,该文件包含所有新生的列表,我需要读取该数据,应用一些公式,并输出两个CSV,一个用于GAFE,一个用于AD,以及我公式的结果 我的想法是读取CSV并将其保存到元组数据类型中,然后用我需要的输出编写一个新的元组,然后保存到新的CSV。我原以为tuple会很好地工作,但我对C#还是新手,我不确定什么工作最好。如果你们有任何其他数据类型的建议,我会喜

我在一个学区工作,我们必须手动创建用户登录(AD)和GAFE帐户。我们希望尽可能实现自动化。目前,我们有一个每天从SIS(学生信息系统)导出的CSV文件,该文件包含所有新生的列表,我需要读取该数据,应用一些公式,并输出两个CSV,一个用于GAFE,一个用于AD,以及我公式的结果

我的想法是读取CSV并将其保存到元组数据类型中,然后用我需要的输出编写一个新的元组,然后保存到新的CSV。我原以为tuple会很好地工作,但我对C#还是新手,我不确定什么工作最好。如果你们有任何其他数据类型的建议,我会喜欢的输入

这是标题-

"SchoolName","firstName","middleName","lastName","grade","studentNumber","Change","startDate","endDate","EnrStartStatus","CalcStartStatus","DateAdded"
"AHS","John","Smith","Doe","12","1779123445","New Student at School","2016-11-29 00:00:00","","","","2016-11-22 20:00:00"
所以,我有一些心理逻辑问题。我不确定如何将CSV转换为元组,而不必执行嵌套的foreach循环(我考虑的方式似乎没有效率)。我想在C#中会有一个库或其他东西,这会让它变得更容易。。。如有任何意见,将不胜感激

谢谢,
Throdne

我建议使用字符串数组而不是元组。 您可以使用以下代码行轻松地将一行csv值转换为字符串数组:

    line.Split( new char[] { '"', ',' }, StringSplitOptions.RemoveEmptyEntries );
这将返回一个字符串数组


使用“and”和“and”作为分隔符可以在同一步骤中去掉“。

我建议使用字符串数组而不是元组。 您可以使用以下代码行轻松地将一行csv值转换为字符串数组:

    line.Split( new char[] { '"', ',' }, StringSplitOptions.RemoveEmptyEntries );
这将返回一个字符串数组


使用“and”和“and”作为分隔符,可以在同一步骤中去掉“。

有几个功能强大的库,可用于大部分工作。一个非常好的方法是,它不仅可以为您读写数据,还可以执行类型转换,以便将您的数字和日期存储为数字和日期

给定与您类似的示例数据:

“名”、“中名”、“姓”、“年级”、“学号”、“报名日期”
“Zigy”、“V.”、“Aurantium”、“12”、“4001809”、“12/13/2016 6:18:21 PM”
“Nancy”、“W.”、“Stackhouse”、“11”、“9762164”、“12/15/2016 7:06:20 PM”
“Sullivan”,“N.,“Deroche”,“11”,“7887589”,“12/11/2016下午1:31:50”

1。为数据设计一个类

public class Student
{
    public int StudentNumber { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public int Grade { get; set; }
    public DateTime EnrollDate { get; set; }

    public Student()
    { }
}
// a form/class level collection for the data
List<Student> myStudents;
2。加载数据

public class Student
{
    public int StudentNumber { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public int Grade { get; set; }
    public DateTime EnrollDate { get; set; }

    public Student()
    { }
}
// a form/class level collection for the data
List<Student> myStudents;
//数据的窗体/类级集合
列出我的学生;
然后加载数据:

using (var sr = new StreamReader(@"C:\Temp\students.csv",  false))
using (var csv = new CsvReader(sr))
{
    csv.Configuration.HasHeaderRecord = true;
    csv.Configuration.QuoteAllFields = true;
    myStudents = csv.GetRecords<Student>().ToList();
}
使用(var sr=newstreamreader(@“C:\Temp\students.csv”,false))
使用(var csv=新的CsvReader(sr))
{
csv.Configuration.HasHeaderRecord=true;
csv.Configuration.quotealFields=true;
myStudents=csv.GetRecords().ToList();
}
就是这样:3行代码。还有许多其他的
配置
选项可以微调它的工作方式。此外:

  • 如果有很多行,您可以关闭
    ToList()
    ,处理
    IEnumerable
    结果,并根据需要加载每一行
  • 如果要使用的属性名称与CSV标题名称不匹配,则可以提供一个映射来告诉CSVHelper哪些字段映射到哪些属性
  • 当没有字段名时,同上
  • 将收藏导出到新的输出CSV与读取它们一样简单
    • 您可能还需要一个(或两个)映射来控制输出CSV的输出顺序

最重要的是,它可以为您转换数据类型。不,等等,最重要的是它不会像
String.split(',')
那样用嵌入的逗号分割字段(如
“Ziggy”、“V.”、“Aurantium,II”、“12”…
注意姓氏数据)。String.split(',')有几个非常强大的库可以为您完成大部分工作。一个非常好的方法是,它不仅可以为您读写数据,还可以执行类型转换,以便将您的数字和日期存储为数字和日期

给定与您类似的示例数据:

“名”、“中名”、“姓”、“年级”、“学号”、“报名日期”
“Zigy”、“V.”、“Aurantium”、“12”、“4001809”、“12/13/2016 6:18:21 PM”
“Nancy”、“W.”、“Stackhouse”、“11”、“9762164”、“12/15/2016 7:06:20 PM”
“Sullivan”,“N.,“Deroche”,“11”,“7887589”,“12/11/2016下午1:31:50”

1。为数据设计一个类

public class Student
{
    public int StudentNumber { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public int Grade { get; set; }
    public DateTime EnrollDate { get; set; }

    public Student()
    { }
}
// a form/class level collection for the data
List<Student> myStudents;
2。加载数据

public class Student
{
    public int StudentNumber { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public int Grade { get; set; }
    public DateTime EnrollDate { get; set; }

    public Student()
    { }
}
// a form/class level collection for the data
List<Student> myStudents;
//数据的窗体/类级集合
列出我的学生;
然后加载数据:

using (var sr = new StreamReader(@"C:\Temp\students.csv",  false))
using (var csv = new CsvReader(sr))
{
    csv.Configuration.HasHeaderRecord = true;
    csv.Configuration.QuoteAllFields = true;
    myStudents = csv.GetRecords<Student>().ToList();
}
使用(var sr=newstreamreader(@“C:\Temp\students.csv”,false))
使用(var csv=新的CsvReader(sr))
{
csv.Configuration.HasHeaderRecord=true;
csv.Configuration.quotealFields=true;
myStudents=csv.GetRecords().ToList();
}
就是这样:3行代码。还有许多其他的
配置
选项可以微调它的工作方式。此外:

  • 如果有很多行,您可以关闭
    ToList()
    ,处理
    IEnumerable
    结果,并根据需要加载每一行
  • 如果要使用的属性名称与CSV标题名称不匹配,则可以提供一个映射来告诉CSVHelper哪些字段映射到哪些属性
  • 当没有字段名时,同上
  • 将收藏导出到新的输出CSV与读取它们一样简单
    • 您可能还需要一个(或两个)映射来控制输出CSV的输出顺序

最重要的是,它可以为您转换数据类型。不,等等,最重要的是它不会用嵌入逗号分割字段(如
中的“Ziggy”、“V.”、“Aurantium,II”、“12”…
注意姓氏数据),而
String.split(“,”)
将使用现有的CSV库。不要试图自己编程。@Jeffmerca有什么建议吗?如果我是你,我会创建一个表示CSV文件行的类,并解析C