【发布时间】:2020-04-10 13:01:58
【问题描述】:
我有一个文件导入,允许用户导入一个 CSV 文件,该文件允许程序将数据添加到数据库中。有多个映射文件,因为 CSV 文件的大小取决于它们要添加的数据,这就是为什么有多个映射类都继承自 CSVBooking
List<string> headers = SplitCSV(textReader.ReadLine()).ToList();
//Called again to reset pos
textReader = new StreamReader(importBookingsFilePath.Text);
var records = new List<CSVBooking>();
using (var reader = new StringReader(textReader.ReadToEnd()))
{
var parser = new CsvParser(reader, CultureInfo.InvariantCulture);
if (parser.Read() != null)
using (var csv = new CsvReader(parser))
{
switch (headers.Count)
{
case 77:
case 86:
csv.Configuration.RegisterClassMap<CSVBookingMapNonPayment>();
break;
case 78:
case 91:
csv.Configuration.RegisterClassMap<CSVBookingMapPayment>();
break;
case 79 when headers.Contains("IP") || headers.Contains("\"IP\""):
csv.Configuration.RegisterClassMap<CSVBookingMapNonPaymentExtraIPInfo>();
break;
case 74:
csv.Configuration.RegisterClassMap<CSVBookingMapNonPayment_DaySail>();
break;
case 87:
csv.Configuration.RegisterClassMap<CSVBookingMapNonPayment_Group>();
break;
case 93:
csv.Configuration.RegisterClassMap<CSVBookingMap_Payment_Crew>();
break;
default:
csv.Configuration.HeaderValidated = null;
csv.Configuration.AutoMap<CSVBooking>();
break;
}
records = csv.GetRecords<CSVBooking>().ToList();
}
else
{
MessageBox.Show($"There was an error parsing the file:\n{importBookingsFilePath.Text}", "Parsing error", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
switch 语句在案例 87 上运行,我提供了文件,parser.Read() 返回有效的标头和数据。
这是程序当前使用的映射文件:
class CSVBookingMapNonPayment_Group: ClassMap<CSVBooking>
{
public CSVBookingMap_Payment_Crew()
{
Map(m => m.SubmissionDateTime).Index(0);
Map(m => m.Title).Index(1);
Map(m => m.Surname).Index(2);
Map(m => m.Firstname).Index(3);
Map(m => m.AKA).Index(4);
...
}
}
class CSVBooking
{
public string IP { get; set; }
public string SubmissionID { get; set; }
[Index(0)]
public string SubmissionDateTime { get; set; }
[Index(1)]
public string Title { get; set; }
[Index(2)]
public string Surname { get; set; }
[Index(3)]
public string Firstname { get; set; }
...
}
【问题讨论】:
-
我不喜欢 CsvReader 类,因为我可以在相同数量的代码中执行相同的操作,而无需使用任何特殊库。人们在使用 CsvReader 时遇到了两个问题,就像您遇到的那样。我需要查看 CSV 文件示例以提供解决方案。 45 年来一直在解析这样的文件。
-
我们这里有一个设计问题。从长远来看,通过检查字段的数量来确定要映射的类可能会导致问题。除此之外,您正在传递基类并且它没有映射器,因此没有记录。我猜应该指定一个类型转换器。
-
@jdweng 是的,我一直在不使用任何库的情况下导入 CSV 文件,但我加入了一个开发团队,他们需要我解决 CSVHelper 的问题,出于某种原因,他们不想从那个图书馆。对于上下文,我正在导入一个 csv 文件,然后将其添加到数据库中,here's a sample file.
-
@OguzOzgul 我没有映射不同的类,它们只是映射到 CSVBooking 的不同映射类,该程序的用户需要将数据导入数据库并且映射配置允许一些变量不要设置为不是数据库中的每个字段都必须填写。我告诉它要映射到哪个类,不要使用基类作为映射。