我有一个像这样的主要细节平面文件:
CSTRID NAME PHN1 EMAIL1 PHN2 EMAIL2 ...
01 Bill 3433 1@b.com 2333 2@b.com
02 Jess 5555 3@b.com
(每行都是客户。它可能有一个或多个联系信息字段)
无论如何使用FileHelpers自动建模吗?无论如何我可以在同一行中拥有主人和细节吗?也许是行分隔符可能不同的某种MultiRecord?
答案 0 :(得分:0)
使用FileHelpers的最佳方法是将其视为描述文件格式和(暂时)忽略所需目标类的方法。然后,在通过FileHelpers引擎运行文件后,您可以在单独的步骤中转换结果记录。
在系统之间移动数据有一个标准名称:ETL代表Extract, Transform, Load。如果您愿意,FileHelpers是一个很好的工具,用于“Extract”部分。
所以在你的情况下,你的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 })
);