2

我正在使用 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,因为该类型在编译时未知。我真的需要使用反射还是有更简单的方法来做到这一点?

4

3 回答 3

1

老实说,我能想到的最简单的方法是使用 IronPython。构造代码字符串并将其传递给 python 引擎。我们用 DLR 和 IronPython 替换了大量的反射。

或者如你所说,你可以反思。

编辑:反映评论:您只需要包含 2 个铁 python 程序集作为参考。这并不难。诚实地。它不是关于安装船装载其他东西。

于 2010-02-11T04:51:29.480 回答
0

您正在使用的库可能会公开一种干净的方法。不过,这是使用反射的一般答案:

Type t = ...  // You already have this
PropertyInfo fieldsProperty = t.GetProperty("Fields",
    BindingFlags.Public | BindingFlags.Instance);
string[] fields = (string[])fieldsProperty.GetValue(record, null);

编辑:

该库似乎具有允许您将文件读入 a 的方法DataTable,这似乎是他们推荐的方法。此页面上显示的示例是:

DataTable dt = engine.ReadFileAsDT("test.txt"); 

这可能比使用反射更简单、更快。

于 2010-02-11T04:51:29.733 回答
0

在代码中声明类。这里不需要使用反射。

于 2010-02-11T04:53:40.760 回答