2016-02-12 84 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或其他電子表格應用程序中打開它,請雙擊右邊的標題邊框,它會自動擴展列寬。