我有一个像这样的主从平面文件:
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/