每天 - 我需要使用FileHelpers库在c#应用程序中处理5个文件。每个文件都来自不同的客户端。
这些文件都代表同一个实体 - 所以我有一个"个人"我的程序中包含所有字段的类,我需要将文件中的数据加载到此对象中。 (文件是分隔文件)
问题是每个文件都以它自己的顺序到达它的列。 所以: 客户端1发送:姓名,姓氏,SSN,年龄 客户端2发送:姓名,年龄,姓氏,SSN 客户端3发送:姓名,SSN,姓氏(年龄是可选的 - 所以这个客户端不会发送它)
我真的很想使用单个类来处理这个问题,而不是为每个客户创建一个类 - 因为我的客户群有望增长: - )
有没有人对使用FileHelpers处理这种情况有任何聪明的想法?
由于
答案 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