2016-02-12 87 views
0

我使用CSVHelper编写了使用MySqlDataReader获取的列表<>。我的问题是与格式化我的CSV文件正确,我创建了一个映射器类,应该规定凡列名其中放置数据:CSVHelper未格式化CSV

public ReaderMap() 
    { 
     Map(m => m.accountpersonfirstname).Name("E-mail Address"); 
     Map(m => m.accountpersonlastname).Name("First Name"); 
     Map(m => m.emailaddress).Name("Last Name"); 
    } 

这直接从http://joshclose.github.io/CsvHelper/#mapping-name来。

我打算假设我的问题在于我的Streamwriter如何写入我现有的csv,因为它每次都会创建一个新的CSV文件(并且我放弃了我的名字),但是我也试过使用按索引进行映射,它应该可以在新的CSV文件上工作,但它仍然会将数据放在彼此相邻的位置我希望我的列分开几列,以便数据可读 - 我还需要标头名称。

这里是我的两个类 - 映射器和原始数据类。

class Reader 
{ 
    public string emailaddress { get; set; } 
    public string accountpersonfirstname { get; set; } 
    public string accountpersonlastname { get; set; } 
} 

class ReaderMap : CsvClassMap<Reader> 
{ 
    public ReaderMap() 
    { 
     Map(m => m.accountpersonfirstname).Name("E-mail Address"); 
     Map(m => m.accountpersonlastname).Name("First Name"); 
     Map(m => m.emailaddress).Name("Last Name"); 
    } 
} 

我也要去贴我的代码部分,因为像我上面提到的,也许我没有正确地使用流作家(虽然我认为我是)。

  MySqlCommand cmd = new MySqlCommand(sqlCmd, cn); 
      cmd.CommandType = CommandType.Text; 
      MySqlDataReader rdr = cmd.ExecuteReader(); 

      while (rdr.Read()) 
      { 
       Reader dataExport = new Reader(); 

       dataExport.accountpersonfirstname = rdr.GetString(0); 
       dataExport.accountpersonlastname = rdr.GetString(1); 
       dataExport.emailaddress = rdr.GetString(2); 


       dataList.Add(dataExport); 

      } 

      var textWriter = new StreamWriter(filePath); 

      var csv = new CsvWriter(textWriter); 
      csv.Configuration.RegisterClassMap<ReaderMap>(); 
      foreach (var item in dataList) 
      { 
       csv.WriteRecord(item); 
      } 

也许这个问题是我的StreamWriter开始在上述范围内或者也许这一切又回到使用数据读取器 - 我不能完全肯定。我希望有人能为我阐明这一点。

编辑:

似乎使用下面的允许它正确地追加。然而,我的原始问题仍然存在的事实是,当我将csv文件中的头名和姓氏进一步移动到F和G列时,它仍将它们放在B和C处,好像它完全忽略了我设置的类和配置。

var textWriter = new StreamWriter(filePath, true); 
+0

我建议你试试FileHelpers库。导出到Csv可以在几行代码中完成。 – Turo

回答

1

当使用自定义CsvClassMap,输出被写入每列的方式一个属性没有间隙,除非一个属性将被忽略,在这种情况下,该属性不输出,而是一个间隙不创建它,其中被忽略。

为了创建你想要的空白,你需要创建一个自定义的方法,以你想要的格式写出文件。

//Write out the header 
var csv = new CsvWriter(textWriter); 
csv.WriteField("A Column Data"); 
csv.WriteField("B (Empty)"); 
csv.WriteField("C (Empty)"); 
csv.WriteField("D (Empty)"); 
csv.WriteField("E (Empty)"); 
csv.WriteField("F Column Data"); 
csv.WriteField("G Column Data"); 
csv.NextRecord(); //Newline 

foreach (var item in dataList) 
{ 
    csv.WriteRecord(item.PropertyA); 
    csv.WriteRecord(string.Empty); 
    csv.WriteRecord(string.Empty); 
    csv.WriteRecord(string.Empty); 
    csv.WriteRecord(string.Empty); 
    csv.WriteRecord(item.PropertyB); 
    csv.WriteRecord(item.PropertyC); 
    csv.NextRecord(); 
} 

说了这么多,你为什么试图插入空白?插入间隙不会使csv更具可读性,并且如果您在Excel或其他电子表格应用程序中打开它,请双击右边的标题边框,它会自动扩展列宽。