2014-03-19 165 views
0

我有一些將數據從類保存到.csv文件的代碼,但我不確定如何將它讀回到類中,以便將其放入列表視圖中。下面是該代碼的保存:將.csv數據導入類

 SaveFileDialog save = new SaveFileDialog(); 
     save.Filter = "Excel|*.csv"; 

     if (save.ShowDialog() == DialogResult.OK) 
     { 
      StreamWriter sw = new StreamWriter(save.FileName); 
      try 
      { 
       sw.WriteLine("Name" + ";" + "Authors" + ";" + "Pages" + ";" + "Date" + ";" + "Price" + ";" + "Copies"); 
       foreach (Book b in bookList) 
       { 
        string aux = ""; 
        aux = string.Join(";", b.Authors);//I know I will probably need to change ';' here because it will have trouble reading it 
        sw.WriteLine(b.Name + ";" + aux + ";" + b.Pages + ";" + b.Date.ToString("dd.MM.yyyy") + ";" + b.Price + ";" + b.Copies); 
       } 
      } 
      catch (IOException ert) 
      { 
       MessageBox.Show(ert.Message); 
      } 
      catch (Exception ew) 
      { 
       MessageBox.Show(ew.Message); 
      } 
      finally 
      { 
       sw.Close(); 
      } 
     } 
+8

你忘了'c#-1.2'標籤。該死的你5標籤限制。 –

+0

有免費的庫可以在兩個方向上做到這一點。 – Magus

+1

嘗試FileHelpers。這種東西非常有用。 http://filehelpers.sourceforge.net/ –

回答

0

這其實很簡單。讓我們假設你有下面的類Book

public class Book 
{ 
    public string Name { get; set; } 
    public int Pages { get; set; } 
    public string AuthorName { get; set; } 
} 

然後你可以簡單的這樣閱讀:

var BooksFromCsv = from row in File.ReadLines(@"C:\books.csv").Where(arg => !string.IsNullOrWhiteSpace(arg) && arg.Length > 0).AsEnumerable() 
        let column = row.Split(';') 
        select new Book 
        { 
         Name = column[0], 
         Pages = column[1], 
         AuthorName = column[2], 
        }; 

結果將是一個IEnumerable<Book>。如果你想要一個列表或一個數組,只需附加一個.ToList().ToArray()

+0

有太多的事情可能會出現錯誤與天真的拆分。如果你知道你的文本將不包含分隔符,這工作正常。但有人第一次在引用的字符串中輸入分號,這會變成一場噩夢。 –

0

如果你只是想保存數據持久化,你可以連載和deserialise你的對象是這樣的:

//保存

using (var fs = new FileStream(path, FileMode.Create)) 
{ 
     var xSer = new XmlSerializer(typeof(objecttype)); 
     xSer.Serialize(fs, myObject); 
} 

// LOAD

using (var fs = new FileStream(path, FileMode.Open)) 
{ 
    var xSer = new XmlSerializer(typeof(objecttype)); 
    myObject = (objecttype)xSer.Deserialize(fs); 
}