我有一个这样的主详细信息平面文件:
CSTRID NAME PHN1 EMAIL1 PHN2 EMAIL2 ...
01 Bill 3433 1@b.com 2333 2@b.com
02 Jess 5555 3@b.com
(每行是一个客户。它可能有 1 个或多个联系信息字段)
反正有没有用 FileHelpers 自动建模?无论如何我可以在同一行中拥有master和details吗?也许某种 MultiRecord 的行分隔符可能不同?
我有一个这样的主详细信息平面文件:
CSTRID NAME PHN1 EMAIL1 PHN2 EMAIL2 ...
01 Bill 3433 1@b.com 2333 2@b.com
02 Jess 5555 3@b.com
(每行是一个客户。它可能有 1 个或多个联系信息字段)
反正有没有用 FileHelpers 自动建模?无论如何我可以在同一行中拥有master和details吗?也许某种 MultiRecord 的行分隔符可能不同?
使用 FileHelpers 的最佳方式是将其视为描述文件格式和(暂时)忽略所需目标类的一种方式。然后,在您通过 FileHelpers 引擎运行文件后,您可以在单独的步骤中转换结果记录。
在系统之间移动数据有一个标准名称:ETL,代表Extract、Transform、Load。如果您愿意,FileHelpers 是一个很好的工具,可以用于其中的“提取”部分。
所以在你的情况下,你的 FileHelpers 类看起来像这样:
[FixedLengthRecord()]
public class MyFileHelpersClass
{
[FieldFixedLength(5)]
public String Cstrid;
[FieldFixedLength(10)]
public String Name;
[FieldFixedLength(10)]
public String Phn1;
[FieldFixedLength(20)]
public String Email1;
[FieldFixedLength(10)]
public String Phn2;
[FieldFixedLength(20)]
public String Email2;
// etc.
}
然后你将它导入到一个数组MyFileHelpersClass[]
中
MyFileHelpersClass[] res = engine.ReadFile("FileIn.txt") as MyFileHelpersClass[];
然后你转换并加载这些结果作为第二步,比如
foreach (MyFileHelpersSpec result in results)
{
Customer customer = new Customer();
customer.Name = result.Name;
if (!String.IsNullOrWhiteSpace(Phn1)
|| !String.IsNullOrWhiteSpace(Email1))
{
Contact contact = new Contact();
contact.Phone = result.Phn1;
contact.Email = result.Email1;
customer.Contacts.Add(contact);
}
if (!String.IsNullOrWhiteSpace(Phn2)
|| !String.IsNullOrWhiteSpace(Email2))
{
Contact contact = new Contact();
contact.Phone = result.Phn2;
contact.Email = result.Email2;
customer.Contacts.Add(contact);
}
}
如果您的转换逻辑非常基本,您通常可以使用 LINQ,例如
var customers = results
.Where(x => String.IsNullOrWhiteSpace(x.Phn1))
.Select(x => new Customer() { Name = x.Name, Phone = x.Phn1 })
.Union(
results
.Where(x => String.IsNullOrWhiteSpace(x.Phn2))
.Select(x => new Customer() { Name = x.Name, Phone = x.Phn2 })
);