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();

これは問題なく機能するようです。デバッガーを使用してステップスルーすると、レコードはImportClassタイプのオブジェクトであり、フィールドフィールドにはファイルのデータが正しく入力されます。

私が抱えている問題は、実際にそのデータをどのように抽出するかです。コンパイル時にそのタイプが不明であるため、レコードをImportClassにキャストできません。本当にリフレクションを使用する必要がありますか、それともこれを行うためのより簡単な方法がありますか?

4

3 に答える 3

1

正直なところ、私が考えることができる最も簡単な方法は、IronPythonを使用することです。コードの文字列を作成し、Pythonエンジンに渡します。1トンの反射をDLRとIronPythonに置き換えました。

またはあなたが言うように、あなたは反省することができます。

編集:コメントを反映するには:参照として2つのironpythonアセンブリを含めるだけで済みます。それほど難しいことではありません。本音をいうと。それはボートロード他のものをインストールすることについてではありません。

于 2010-02-11T04:51:29.480 に答える
0

使用しているライブラリによって公開される、これを行うためのクリーンな方法がおそらくあります。それでも、Reflectionを使用した一般的な回答は次のとおりです。

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

編集:

このライブラリには、代わりにファイルを読み込むことができるメソッドがあるようですDataTable。これが推奨されるアプローチのようです。このページに示されている例は次のとおりです。

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

これはおそらく、Reflectionを使用するよりも簡単で高速です。

于 2010-02-11T04:51:29.733 に答える
0

コードでクラスを宣言します。ここでリフレクションを使用する必要はありません。

于 2010-02-11T04:53:40.760 に答える