2

csv ファイルを使用するサイトを作成しています。このファイルは 2 つの形式で提供されます (将来的にはさらに増える可能性があります)。

構造 1

Header 1 Header 2 Header 3 Header 4 
a          b      c       d
x          x      x       x

構造 2

Header 1 Header 4
a          d
x          x

上記はExcelでの表示方法です(生で見ると、すべてカンマで区切られます)

2 つの構造が必要な理由は、ユーザーがデータをエクスポートできるサード パーティのサイトを活用しようとしているからです。このサイトは、最初の行がヘッダーである csv ファイルとしてエクスポートします。私は本当に2つのヘッダーしか気にせず、現時点ではリセットは必要ありません(ただし、選択して選択できないすべての列をエクスポートする必要があります)。

2番目の構造は、ユーザーがこのサイトを使いたくない、使いにくいなどの理由で使用したくない場合です。Excelを開いてデータを手動で書き込み、csvとして保存するオプションがあります。ファイル。

したがって、手動の人にとっては、ヘッダー 2 とヘッダー 4 のデータを使用していないかのように、できるだけ簡単にしたいのですが、わざわざ入力してもらう必要があるのはなぜですか? ただし、同時に、最初の方法でデータをエクスポートする場合、ファイルを Excel にロードして 2 つの列を削除する必要はありません。

ヘッダーは常に無傷で、最初の行にする必要があります。私が思いついた唯一のアイデアは、最初の行を読んでヘッダーの順序を確認することです。正確な順序で 4 つのヘッダーがある場合は、一方向にレンダリングします。その順序で 2 つのヘッダーのみが別の方法でレンダリングされる場合。

FileHelpersには複数の区切り文字を実行し、それをレンダリングする方法を選択する機能があることは知っていますが、ヘッダーを見ているので、これが焼き付けられているのか、それとも何らかの形で自分で書いて何をすべきかを伝える必要があるのか​​ わかりません。

ファイルヘルパーでこれを行うことができるかどうか、誰かが考えていますか?

編集 これは私がこれまでに持っているものです

MultiRecordEngine engine = new MultiRecordEngine(typeof(Format2), typeof(Format1));
    engine.RecordSelector = new RecordTypeSelector(CustomSelector);

    using (TextReader textReader = new StreamReader(stream))
    {
        if (engine.RecordType == typeof(Format2))
        {
            var myArry = engine.ReadStream(textReader) as Format2[];

        }
        else if(engine.RecordType == typeof(Format1))
        {
            var myArry = engine.ReadStream(textReader) as Format1[];
        }



    }
4

2 に答える 2

5

以下に、いくつかの推奨されるアプローチを示します。

エンジンを作成するに、ファイルの最初の行 (FileHelpers の外側) を読み取り、使用されている形式を判断します。

if (firstLineOfFile.Contains("Header 2"))
    FileHelperEngine engine = new FileHelperEngine(typeof(Format1)); 
else
    FileHelperEngine engine = new FileHelperEngine(typeof(Format2)); 

または、 MultiRecordEngineを使用できます

MultiRecordEngine engine;  
engine = new MultiRecordEngine(typeof(Format1), typeof(Format2)); 
engine.RecordSelector = new RecordTypeSelector(CustomSelector); 

次のようなセレクターメソッドを使用して

Type CustomSelector(MultiRecordEngine engine, string record) 
{ 
    // count the separators to determine which format to return
    int separatorCount = record.Count(f => f == ',');
    if (separatorCount == 4) 
        return typeof(Format1); 
    else 
        return typeof(Format2); 
} 

(MultiRecordEngine は、将来、より多くのフォーマットを処理できます。パラメーターを持つコンストラクターがありparamsます) 。

于 2012-01-10T09:51:44.647 に答える
1

FileHelpers では、事前にフォーマットを知っておく必要があります。

つまり、FileHelpers を使用してファイルを解析する前に、ファイルの形式を (説明した方法を使用して) 検出する必要があります。

于 2012-01-10T00:29:14.180 に答える