如何动态更改FileHelpers中类的字段顺序

时间:2017-03-31 14:21:02

标签: c# filehelpers

每天 - 我需要使用FileHelpers库在c#应用程序中处理5个文件。每个文件都来自不同的客户端。

这些文件都代表同一个实体 - 所以我有一个"个人"我的程序中包含所有字段的类,我需要将文件中的数据加载到此对象中。 (文件是分隔文件)

问题是每个文件都以它自己的顺序到达它的列。 所以: 客户端1发送:姓名,姓氏,SSN,年龄 客户端2发送:姓名,年龄,姓氏,SSN 客户端3发送:姓名,SSN,姓氏(年龄是可选的 - 所以这个客户端不会发送它)

我真的很想使用单个类来处理这个问题,而不是为每个客户创建一个类 - 因为我的客户群有望增长: - )

有没有人对使用FileHelpers处理这种情况有任何聪明的想法?

由于

3 个答案:

答案 0 :(得分:0)

解决方案可能是为每个csv文件插入一个带有字段名称的标题行,并在您的类中管理它

答案 1 :(得分:0)

就个人而言,我会强烈推动这些方法中的任何一种:

a)授权字段顺序(以及每个列数据类型的准确规范,唯一性等)。新客户使用规定的格式,并鼓励旧客户在对其导出进行其他更改时进行切换。

b)让您的客户切换到您指定的格式,其中字段顺序并不重要,例如JSON或XML。用它来卖"它允许更多功能"。

c)如果a)& b)不可行,在需要时使用多个类,作为预处理,然后转换为您自己的内部类。如果您不能向客户强制执行现场订单,那么除了字段顺序之外的其他内容很可能在某些时候也会有所不同,因此您最终还是会进行客户特定的处理。仍然尽可能使用几个类,也许一些客户可以使用相同的顺序&内容。

我的0.02SKr价值(瑞典语:)

答案 2 :(得分:0)

您可以使用string[] columns; // populate this somehow: e.g., read the header. // create the FileHelpers record class // alternatively there is a 'FixedClassBuilder' DelimitedClassBuilder cb = new DelimitedClassBuilder("Customers", ","); cb.IgnoreFirstLines = 1; cb.IgnoreEmptyLines = true; // populate the fields based on the columns foreach (string column in columns) { cb.AddField(column, typeof(string)); cb.LastField.TrimMode = TrimMode.Both; } // load the dynamically created class into a FileHelpers engine FileHelperEngine engine = new FileHelperEngine(cb.CreateRecordClass()); // import your records DataTable dt = engine.ReadFileAsDT("testCustomers.txt"); 并在代码中构建记录类。

dfs =[]
for a in data():
    for b in data():
        tempDataFrame = pd.DataFrame(columns=colNames)
        tempDataFrame['Temp']= var.Temp
        tempDataFrame['Year']= var.Year
        dfs.append(tempDataFrame)

        traces.append(go.scatter(x=dfs['Year'],y=dfs['Temp']))
 normData=pd.concat(dfs,ignore_index=True)
 return traces