【问题标题】:Import .csv data into class [duplicate]将.csv数据导入类[重复]
【发布时间】:2014-03-19 15:15:19
【问题描述】:

我有一些将数据从类保存到 .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();
            }
        }

【问题讨论】:

  • 您忘记了c#-1.2 标签。该死的你5标签限制。
  • 有免费可用的库可以双向执行此操作。
  • 试试 FileHelpers。对于那种东西非常有用。 filehelpers.sourceforge.net
  • 您为什么使用 csv 而不是 xml?否则你可以很容易地序列化和反序列化......
  • linq2csv 可能有用

标签: c#


【解决方案1】:

这其实很简单。假设您有以下课程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()

【讨论】:

  • 天真的拆分会导致很多问题。如果您知道您的文本将不包含分隔符,则可以正常工作。但是第一次有人在带引号的字符串中加上分号时,这就变成了一场噩梦。
  • 如果文件中也包含标题,这会起作用吗?
  • 应该是可以的。唯一要添加的是跳过第一行的 Skip 调用。
【解决方案2】:

如果您只想持久保存数据,您可以像这样对对象进行序列化和反序列化:

// 保存

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

//加载

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

【讨论】:

    猜你喜欢
    • 2011-06-29
    • 2012-07-30
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2017-07-19
    • 2013-04-21
    相关资源
    最近更新 更多