CSV到对象列表

时间:2019-02-15 04:03:42

标签: c# csv servicestack servicestack-text

我当前正在使用ServiceStack.Text将CSV反序列化为对象列表。

我的模特

public class UploadDocument
{
    [DataMember(Name = "Patient")]
    public string Patient { get; set; }

    [DataMember(Name = "Patient First Name")]
    public string PatientFirstName { get; set; }

    [DataMember(Name = "Patient Last Name")]
    public string PatientLastName { get; set; }

    [DataMember(Name = "Email")]
    public string Email { get; set; }
}

C#代码

var csvData = System.IO.File.ReadAllText(fileName).FromCsv<List<UploadDocument>>();

即使CSV中缺少任何列,即CSV仅包含“患者,患者的姓氏”,这仍然可以很好地工作。

但是当有没有标题的额外列时,它将抛出错误

Patient,    Patient First Name, Patient Last Name,  Email
XXX,        YYY,                ZZZZZ,              nwerwer@yahoo.com,      QWER
XXX,        YYY,                ZZZZZ,              nwerwerwe@yahoo.com,    QWER
XXX,        YYY,                ZZZZZ,              nwerwe@yahoo.com,       QWER

我该如何处理?

这里的期望是,即使列数较少或没有标题的额外行,匹配的列(CSV标题和类属性)也应加载而没有任何问题。

注意:每个文件的CSV列顺序将有所不同

1 个答案:

答案 0 :(得分:0)

您是否尝试过跳过第一行?

var results = csv.SubString(csv.IndexOf('\n')).FromCsv<List<UploadDocument>>();
  

但是,如果有任何没有标题的额外列

,则会引发错误

但是由于您的CSV无效,因此在尝试反序列化之前,最好修复源.csv,以确保它包含正确数量的标头作为字段,例如:

var validCsv = csv.LeftPart('\n') + ",MissingName\n" + csv.RightPart('\n');
var results = validCsv.SubString(csv.IndexOf('\n')).FromCsv<List<UploadDocument>>();