CSharp - CsvReader忽略空白列

  显示原文与译文双语对照的内容
0 0

我第一次使用 CSVhelper 。 另一个程序正在导出一个csv文件,该文件如下所示


,"Employee","Earnings 1/Rate","Note"
,"John Doe","Regular 10.50","Started Sep 1"

问题是,我有一个空白的专栏,在开始时与之竞争。 我不希望用户使用excel使用 delete 来使用该文件。 因此,如何忽略第一列或者将列添加到我的datatable中。

csv文件中不存在错误( 查看程序底部的注释行)的字段空白

用于读取数据的类


namespace PayRateTracker
{
 public class TestRecord
 {
 public string Blank { get; set; }
 public string Employee {get; set;}
 public string Earning { get; set; }
 public string Note { get; set; }
 }

 public class MyClassMap : CsvClassMap<TestRecord>
 {
 public override void CreateMap()
 {
 Map(m => m.Blank).Index(0);
 Map(m => m.Employee).Index(1);
 Map(m => m.Earning).Index(2);
 Map(m => m.Note).Index(3);
 }
 }
}

我有一个评论,错误是在底部附近发生


namespace PayRateTracker
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();

//Stream reader will read test.csv file in current folder
 StreamReader sr = new StreamReader(@"G:2013-09-20.csv");

//Csv reader reads the stream
 CsvReader csvread = new CsvReader(sr);

//csvread will fetch all record in one go to the IEnumerable object record
 IEnumerable<TestRecord> record = csvread.GetRecords<TestRecord>();

//foreach (var rec in record)//Each record will be fetched and printed on the screen
//{
//lblDisplay.Text = (string.Format("Name : {0}, Amount : {1}, Notes : {2} <br/>", rec.Employee, rec.Earning, rec.Note));
//}
 sr.Close();
 }

 private void button1_Click(object sender, EventArgs e)
 {
 DataTable dt = new DataTable();
 using (var stream = File.OpenRead(@"G:Test.csv"))
 {
 using (var reader = new StreamReader(stream))
 {
 using (var csvReader = new CsvReader(reader))
 {
 csvReader.Configuration.RegisterClassMap<MyClassMap>();
 int i = 0;
 while (csvReader.Read())
 {
 if (csvReader.FieldHeaders[0] =="")
 {
 csvReader.FieldHeaders[0] ="Blank";
 }
 if (i == 0)
 {
 foreach (var field in csvReader.FieldHeaders)
 {
 dt.Columns.Add(field);
 }
 }

 DataRow row = dt.NewRow();
 foreach (var field in csvReader.FieldHeaders)
 {
 row[field] = csvReader.GetField(field);//<-- Error here
 }
 dt.Rows.Add(row);

 i += 1;
 }
 }
 }
 }
//return dt;
 dataGridView1.DataSource = dt;
 }
 }
}

时间: 原作者:

0 0

这里的问题是你正在查看头,如果看到一个空头,则将它的改为 "Blank" 。 现在,当你正在循环的字段标题,你试图通过 "Blank" 获得字段,它不存在。

是否需要将空白列作为数据表的一部分?

这里有几个你可以做的改变。

创建了类和映射,但未使用其中之一。 你可以这样做:


var records = csvReader.GetRecords<TestRecord>();

records 将是一个 IEnumerable<TestRecord>

它听起来像空列没有被使用,所以你可以删除它的映射。


public class MyClassMap : CsvClassMap<TestRecord>
{
 public override void CreateMap()
 {
 Map(m => m.Employee).Index(1);
 Map(m => m.Earning).Index(2);
 Map(m => m.Note).Index(3);
 }
}

它看起来你可以能只想将CSV文件中的任何内容放入一个使用相同头的数据表中。 你可以稍微修改一下你当前的代码。


row[0] = csvReader[0];
//Skip the first column.
for( var j = 1; j <csvReader.FieldHeaders.Length; j++ )
{
 row[j] = csvReader[j];
}

原作者:
...