2

我有一个这样的主详细信息平面文件:

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 的行分隔符可能不同?

4

1 回答 1

0

使用 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 })
    );
于 2013-06-07T10:49:34.017 回答