CSV文件具有不同的行

时间:2019-04-05 13:18:41

标签: c#

我有一个csv文件,如下所示:

M;2017.12.01 17:04;1;example@example.com

T;1;K001;2

T;1;N001;1

M;2017.11.01 15:56;2;example@example.com

T;2;P001;2

T;2;P001;1

我的问题是我必须将此文件读入List<>并能够使用索引在其中导航,但长行之后的不同类型的行使我感到困惑。

class Order
{
    public string Type { get; set; }
    public DateTime Date { get; set; }
    public string OrderID { get; set; }
    public string Email { get; set; }
    public string ItemNumber { get; set; }
    public int Quantity { get; set; }

    public Order(string[] ordered , string[] items)
    {
        Type = ordered[0];
        Date = DateTime.Parse(ordered[1]);
        OrderID = ordered[2];
        Email = ordered[3];
        Type = items[0];
        OrderID = items[1];
        ItemNumber = items[2];
        Quantity = int.Parse(items[3]);
    }

}
class Program
{
    static List<Order> orders = new List<Order>();

    static void Main(string[] args)
    {           
        Reading();
    }

    private static void Reading()
    {
        using (System.IO.StreamReader reader = new System.IO.StreamReader("orders.csv"))
        {
            while (!reader.EndOfStream)
            {
                orders.Add(new Order(reader.ReadLine().Split(';') ,  reader.ReadLine().Split(';')));                   
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以在创建之前尝试识别该行。
比您可以创建两种不同的方法来初始化订单。

while (!reader.EndOfStream)
{
    var values = reader.ReadLine().Split(';');
    if(DateTime.TryParse(values.Skip(1).First(), out var date)) {
        orders.Add(Order.FromOrderWithDate(values));
    }
    else
        orders.Last().Items.Add(Item.FromOrderWithEmail(values));
}

这两种方法类似

public static Order FromRow(string[] ordered) =>  
    new Order {
    Type = ordered[0],
    Date = DateTime.Parse(ordered[1]),
    OrderID = ordered[2],
    Email = ordered[3],
    Items = new List<Item>();
};
public static Item FromRow(string[] items) =>  
    new Item {
    Type = items[0],
    OrderID = items[1],
    ItemNumber = items[2],
    Quantity = int.Parse(items[3])
};

最后是两个不同的类,一个用于订购,一个用于物品,Order应该包含一个物品清单。

答案 1 :(得分:0)

尝试类似的东西:

List<Customer> customers = new List<Customer>();
Customer lastCustomer = null;

foreach(var line in File.ReadLines("orders.csv"))
{
   var values = line.Split(';');

   if (values[0]=="M")
   {
      lastCustomer = new Customer(values);
      customes.Add(lastCustomer);
   }
   else if (values[0]=="T" && lastCustomer != null)
   {
      lastCustomer.AddOrder(values);
   }
}

(您将需要编写一个Customer类,该类可以从字符串数组构造其自身,并且具有一种将新Order对象添加到其自己的订单列表中,然后再次从数组构造它们的方法)