无法使用Lumenworks CsvReader解析CSV文件的最后一行

时间:2015-10-21 16:12:15

标签: c# .net parsing csv lumenworks

我正在尝试使用CSV file解析以下LumenWorks CsvReader

这是我的代码:

    using (DatabaseEntities context = new DatabaseEntities())
    {
        using (var csv = new CachedCsvReader(new StreamReader(@"C:\Users\Me\Desktop\sdn.csv"), false))
        {
            context.Database.ExecuteSqlCommand("TRUNCATE TABLE ofac_sdn");

            foreach (var entry in csv)
            {
                var ofac = new ofac_sdn
                {
                    ent_num = Convert.ToInt32(entry[0]),
                    SDN_Name = entry[1],
                    SDN_Type = entry[2],
                    Program = entry[3],
                    Title = entry[4],
                    Call_Sign = entry[5],
                    Vess_type = entry[6],
                    Tonnage = entry[7],
                    GRT = entry[8],
                    Vess_flag = entry[9],
                    Vess_owner = entry[10],
                    Remarks = entry[11]
                };

                context.ofac_sdn.Add(ofac);
            }
        }

        context.SaveChanges();

对于除最后一行之外的所有行,我都没有问题。 entry中的每个foreach都包含正确分隔的每一行信息,并且我的ofac_sdn个实例都加载了正确的数据。

但是,CSV文件在文件末尾有些奇怪,如下图所示(取自Notepad ++):

Issue

foreach到达最后一行时,它会抛出以下异常:

  

“在位置记录'5913'字段'1附近,CSV似乎已损坏   '0'。目前的原始数据:''。“

我能想到的最简单,最简单的解决方案是在尝试解析之前以编程方式删除文件的最后一行,但这看起来像是一个“廉价”修复程序,无法解决根本问题。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我无法使用Lumenworks CsvReader或几乎任何其他图书馆,直到我CsvHelper尝试Josh Close

using (DatabaseEntities context = new DatabaseEntities())
{
    if (ofacFile != null)
    {
        var csv = new CsvReader(ofacFile);
        csv.Configuration.TrimFields = true;
        csv.Configuration.HasHeaderRecord = false;
        context.Database.ExecuteSqlCommand("TRUNCATE TABLE ofac_sdn");

        while (csv.Read())
        {
            if (csv.GetField<string>(0) == "\u001a")
            {
                break; // End of file
            }

            var ofac = new ofac_sdn
            {
                ent_num = csv.GetField<int>(0),
                SDN_Name = csv.GetField<string>(1),
                SDN_Type = csv.GetField<string>(2),
                Program = csv.GetField<string>(3),
                Title = csv.GetField<string>(4),
                Call_Sign = csv.GetField<string>(5),
                Vess_type = csv.GetField<string>(6),
                Tonnage = csv.GetField<string>(7),
                GRT = csv.GetField<string>(8),
                Vess_flag = csv.GetField<string>(9),
                Vess_owner = csv.GetField<string>(10),
                Remarks = csv.GetField<string>(11)
            };

            context.ofac_sdn.Add(ofac);
        }
    }
}

这是唯一允许我实际读取最后一条“腐败”行的库,虽然我不喜欢与\u001a直接比较(这是最后一行写的),它确实有用。