2017-07-29 89 views
0

我有一个包含一些漂亮的一般属性的模型:C#MVC使用CSV文件

public class ProductItem 
{ 
    public int  ID { get; set; } 
    public string Description { get; set; } 
    public char  Item { get; set; } 
    public decimal Price { get; set; } 
    public string ImagePath { get; set; } 
    public string Barcode { get; set; } 
} 

我用下面这个模型从一个CSV文件中填充的实例:

  DataTable dt = new DataTable(); 
     dt.Columns.Add("ID", typeof(System.Int32)); 
     dt.Columns.Add("Description", typeof(System.String)); 
     dt.Columns.Add("Item", typeof(System.Char)); 
     dt.Columns.Add("Price", typeof(System.Decimal)); 
     dt.Columns.Add("ImagePath", typeof(System.String)); 
     dt.Columns.Add("Barcode", typeof(System.String)); 

     String[] csv = File.ReadAllLines(csvPath); 

     foreach (string csvrow in csv) 
     { 
      var fields = csvrow.Split(','); 
      var row = dt.NewRow(); 

      row.ItemArray = fields; 
      dt.Rows.Add(row); 
     } 

     return dt; 

这返回一个Datatable,然后用于以下函数以获取该列表:

 private List<ProductItem> GetAllProductsCSV() 
    { 
     var filePath = Server.MapPath(@"~/CSV/products.csv"); 
     var products = new ProductsCSV(); 
     DataTable results = products.GetProductsFromCSV(filePath); 

     List<ProductItem> productItems = (from DataRow dr in results.Rows 
              select new ProductItem() 
              { 
               ID = Convert.ToInt32(dr["ID"]), 
               Description = dr["Description"].ToString(), 
               Item = Convert.ToChar(dr["Item"]), 
               Price = Convert.ToDecimal(dr["Price"]), 
               ImagePath = dr["ImagePath"].ToString(), 
               Barcode = dr["Barcode"].ToString(), 
              }).ToList(); 

     return productItems; 
    } 

首先,这是所有s对于我认为应该容易得多的事情,我的工作似乎有些复杂......我为自己做了很多工作,而不是我需要的吗?

其次,当我对模型实例进行更改并需要将其写回到CSV文件时,我正在逆转此过程中的一些问题。我知道我需要重新写入整个回来(因为我已经读过,你不能只更新CSV中的一行)......但如果有人有一些如何最好地实现这一点的例子将不胜感激。

+0

这样的情况不清楚为什么你加载一个数据表与你的CSV而不是直接'列表' – Steve

+0

对不起,刚刚意识到我已经把一半那里的故事...会添加一些(可能更多)令人费解的代码... – CJH

+2

这不是一个好方法。 CSV格式[比这更复杂](http://www.secretgeek.net/csv_trouble); Split(',')'和Join(',')'只会解析一小部分CSV文件。有[许多](https://stackoverflow.com/questions/9642055/)测试,工作,调试CSV分析器准备好你放入你的应用程序。 –

回答

1

我会直接转到List<ProductItem>而不是加载DataTable,然后将其转换为List。

public List<ProductItem> LoadData(csvPath) 
{ 
    String[] csv = File.ReadAllLines(csvPath); 
    List<ProductItem> result = new List<ProducItem>(); 
    foreach (string csvrow in csv) 
    { 
     var fields = csvrow.Split(','); 
     ProductItem prod = new ProductItem() 
     { 
      ID = Convert.ToInt32(fields[0]), 
      Description = fields[1], 
      Item = fields[2][0], 
      Price = Convert.ToDecimal(fields[3]), 
      ImagePath = fields[4], 
      Barcode = fields[5] 
     }); 
     result.Add(prod); 
    } 
    return result; 
} 

逆过程将在你的列表中的一个环,并建立一个适当的CSV行中的文件中写入

public void WriteToCsv(string csvPath, List<ProductItem> products) 
{ 
    List<string> lines = new List<string>(); 
    foreach(ProductItem item in products) 
    { 
     string line = string.Join(",", item.ID.ToString(), 
             item.Description, 
             item.Item.ToString(), 
             item.Price.ToString(), 
             item.ImageCode, 
             item.BarCode); 
     lines.Add(line); 
    } 
    File.WriteAllLines(csvPath, lines); 
} 

还铭记保持,这是加载一个写得很simplicistic方式一个CSV文件。为此,最好使用专门的库。一个库将处理像描述字段内的逗号或字段之间的某种类型的分隔符

+0

非常感谢Steve!你不仅给了我这个清晰的内容,而且还帮助我清理了我现存的代码!我在EF中完成了大部分工作,所以这对我来说是一种黑暗的艺术!不胜感激! – CJH