掌握/详细说明FileHelpers在同一行中的平面文件

时间:2013-06-07 08:26:16

标签: c# filehelpers

我有一个像这样的主要细节平面文件:

CSTRID NAME PHN1 EMAIL1  PHN2 EMAIL2 ...
01     Bill 3433 1@b.com 2333 2@b.com 
02     Jess 5555 3@b.com

(每行都是客户。它可能有一个或多个联系信息字段)

无论如何使用FileHelpers自动建模吗?无论如何我可以在同一行中拥有主人和细节吗?也许是行分隔符可能不同的某种MultiRecord?

1 个答案:

答案 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 })
    );