C# CSV文件有不同的行

C# CSV文件有不同的行,c#,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 我的问题是,我必须将此文件读入列表,并能够使用索引在其中导航,但长行之后的不同类型的行让我感到困惑 class Order { public string Type { get; set; }

我有一个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
我的问题是,我必须将此文件读入
列表
,并能够使用索引在其中导航,但长行之后的不同类型的行让我感到困惑

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]);
    }

}
类程序
{
静态列表顺序=新列表();
静态void Main(字符串[]参数)
{           
阅读();
}
私有静态无效读取()
{
使用(System.IO.StreamReader=new System.IO.StreamReader(“orders.csv”))
{
而(!reader.EndOfStream)
{
添加(新订单(reader.ReadLine().Split(“;”),reader.ReadLine().Split(“;”));
}
}
}
}

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

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])
};
public static Order FromRow(string[]ordered)=>
新秩序{
类型=有序[0],
Date=DateTime.Parse(有序[1]),
OrderID=有序[2],
电子邮件=已订购[3],
项目=新列表();
};
行中的公共静态项(字符串[]项)=>
新项目{
类型=项目[0],
OrderID=项目[1],
ItemNumber=项目[2],
数量=int.Parse(项目[3])
};
最后是两个不同的类,一个用于订单,另一个用于项目,
order
应该包含项目列表。

尝试如下操作:

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);
   }
}
列出客户=新建列表();
客户lastCustomer=null;
foreach(File.ReadLines(“orders.csv”)中的var行)
{
变量值=行分割(“;”);
如果(值[0]=“M”)
{
lastCustomer=新客户(价值);
customes.Add(lastCustomer);
}
else if(值[0]=“T”&&lastCustomer!=null)
{
lastCustomer.AddOrder(值);
}
}

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

如果要解析两种不同类型的行,您需要使用至少一个代码分支短行代表什么?它们与前面的长线有关吗?是的,长线代表购买了某件物品的客户,而长线下的短线代表购买物品的数据。