C#でReflectionを使用してフラットファイルのスキーマを読み取る方法簡単な概要は次のとおりです。データをフラットファイルとして保存しているサーバーがあり、SQLServerからこれらのフラットファイルにデータをプッシュする必要があります。そのために私は彼らのスキーマを知る必要があります。私はこれについてはわかりません、どんな助けも素晴らしいでしょう。
1 に答える
リフレクションが役に立たないように聞こえるため、この質問をどこから始めればよいかわかりませんが、ソリューションに表示する必要があると指定しました! :)
その結果、この回答はほとんど当て推量であり、より多くの情報を明らかにするにつれて進化する可能性があります. これで問題ありません。質問が何であるかを知るまで、答え (42) を得ることができません。
フラット ファイルの定義は 1 つではありません。おそらく必要なのは、ファイル内の「レコード」を解析する関数です。通常のアプローチは、16 進エディタでファイルを開き、いくつかのサンプル レコードからフォーマットを推測することです。繰り返しパターンの形状に関する手がかりを探します。各「レコード」は多数の「フィールド」で構成されているように見えますか? 毎回決まった順序で表示されますか?それとも、各フィールドの前に名前または番号が付けられ、意味を示していますか? プレーン テキストのように見えますか。つまり、重要な情報を失うことなくメモ帳で開くことができますか?
レコードを表すクラスを宣言します。
public class FlatFileRecord
{
public string FirstName { get; set; }
public string LastName { get; set; }
// etc.
}
次に、ストリームから読み取ってレコードを生成する関数を作成します。
public static IEnumerable<FlatFileRecord> ParseFlatFile(StreamReader stream)
{
// etc.
ファイルが「プレーン テキスト」の場合 (つまり、レコードまたはフィールドを区切る重要な方法で使用されるキャリッジ リターン/ライン フィード文字が含まれている場合) は、StreamReader を使用するのが適切です。
各レコードがプレーン テキストの行であるとします (つまり、各レコードは特別な行末シーケンスで区切られています)。その行内には複数のフィールドがあり、何らかの形で他の特殊文字で区切られています。パーサーはループとして構成されている可能性があります。
string line;
while ((line = r.ReadLine()) != null)
yield return new FlatFileRecord(line);
これにより、問題は 2 つのレベルに分けられます。外側のレベルは一度に 1 つずつ行を通過し、それぞれが 1 つのレコードを生成します。次に、FlatFileRecord のコンストラクターに入れることを想像した内部レベルがあります。行を渡すと、その行から抽出する方法を知っているフィールド値が入力されます。そのため、FlatFileRecord のコンストラクターを作成する必要があります。