我正在尝试使用CSV文件解析下面的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++):

当foreach到达最后一行时,它会抛出以下异常:
“CSV似乎在'0‘位置的记录'5913’字段'1‘附近损坏。目前的原始数据:’”。
我能想到的最简单、最简单的解决方案是在尝试解析文件之前以编程方式删除文件的最后一行,但这看起来是一个“廉价”的修复,不会解决根本问题。有什么想法吗?
发布于 2015-10-28 17:19:54
在我尝试CsvHelper by 乔希·克洛斯之前,我无法让它与Lumenworks、乔希·克洛斯或几乎任何其他的库一起工作。
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 (这是在最后一行中所写的),但它确实有效。
https://stackoverflow.com/questions/33264266
复制相似问题