我有一个像这样的主从平面文件:

CSTRID NAME PHN1 EMAIL1  PHN2 EMAIL2 ...
01     Bill 3433 [email protected] 2333 [email protected]
02     Jess 5555 [email protected]


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

无论如何,有没有使用FileHelpers自动建模的模型?无论如何,我可以在同一行中拥有母版和详细信息吗?也许某些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 })
    );

关于c# - 在同一行中使用FileHelpers掌握/详细平面文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16979480/

10-13 01:10