我正在使用FileHelpers使用以下代码解析结构未知的CSV文件:
string cd = string.Format(@"[DelimitedRecord(""{0}"")]
public sealed class ImportClass {{
[FieldQuoted('{1}')]
public string[] Fields;
}}", _delimiter, _quote);
Type t = DelimitedClassBuilder.ClassFromString(cd);
var engine = new FileHelperAsyncEngine(t);
engine.BeginReadFile(filename);
object record;
while ((record = engine.ReadNext()) != null) {
}
engine.Close();
这似乎工作得很好。当我使用调试器逐步执行它时,record是ImportClass类型的对象,Fields字段正确地填充了文件中的数据。
我遇到的问题是如何实际提取数据?我无法将记录转换为ImportClass,因为在编译时不知道该类型。我真的需要使用反射还是有更简单的方法来做到这一点?
答案 0 :(得分:1)
老实说,我能想到的最简单的方法就是使用IronPython。构造代码字符串并将其传递给python引擎。我们用DLR和IronPython取代了一吨反射。
或者正如你所说,你可以反思。
编辑:反映意见: 您只需要包含2个铁蟒蛇组件作为参考。这并不难。老实说。它不是关于安装船装其他东西。
答案 1 :(得分:0)
您正在使用的库可能有一种干净的方式。然而,这是使用反射的一般答案:
Type t = ... // You already have this
PropertyInfo fieldsProperty = t.GetProperty("Fields",
BindingFlags.Public | BindingFlags.Instance);
string[] fields = (string[])fieldsProperty.GetValue(record, null);
编辑:
此库似乎有一些方法可以让您将文件读入DataTable
,这似乎是他们推荐的方法。 this page上显示的示例是:
DataTable dt = engine.ReadFileAsDT("test.txt");
这可能比使用Reflection更简单,更快。
答案 2 :(得分:0)
在代码中声明类。这里不需要使用反射。