2014-03-19 163 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); 
}