C# 在同一行中包含FileHelper的主/详细平面文件

C# 在同一行中包含FileHelper的主/详细平面文件,c#,filehelpers,C#,Filehelpers,我有一个主详细信息平面文件,如下所示: CSTRID NAME PHN1 EMAIL1 PHN2 EMAIL2 ... 01 Bill 3433 1@b.com 2333 2@b.com 02 Jess 5555 3@b.com [FixedLengthRecord()] public class MyFileHelpersClass { [FieldFixedLength(5)] public String Cstrid; [FieldFixe

我有一个主详细信息平面文件,如下所示:

CSTRID NAME PHN1 EMAIL1  PHN2 EMAIL2 ...
01     Bill 3433 1@b.com 2333 2@b.com 
02     Jess 5555 3@b.com
[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.
}      
(每行都是一个客户。它可能有一个或多个联系人信息字段)


是否仍然可以使用FileHelpers自动对此进行建模?我是否可以在同一行中获得主控和详细信息?可能是某种行分隔符不同的多记录?

使用FileHelper的最佳方式是将其视为描述文件格式的一种方式,并(暂时)忽略所需的目标类。然后,在通过FileHelpers引擎运行文件后,可以在单独的步骤中转换生成的记录

在系统之间移动数据有一个标准名称:ETL,代表。如果您愿意,FileHelpers是一个很好的工具,用于“提取”部分

因此,在您的情况下,您的FileHelpers类将如下所示:

CSTRID NAME PHN1 EMAIL1  PHN2 EMAIL2 ...
01     Bill 3433 1@b.com 2333 2@b.com 
02     Jess 5555 3@b.com
[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[] 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);
    }               
}
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 })
    );
如果变换逻辑非常基本,通常可以使用LINQ,例如

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

对不起,你没抓住重点。我事先不知道一行中会有多少联系人信息字段。引用这个问题:“它可能有一个或多个联系人信息字段”,我知道我必须关注文件结构,而不是所需的输出类。无论如何,我已经想出了一个简洁的解决方案,明天我将编写代码并与大家分享,这是一件很好的事情。