52

最終的に生成された CSV にヘッダー行を追加する FileHelper ライブラリに組み込みのフィールド属性はありますか?

私はグーグルで検索しましたが、それに関する情報はあまり見つかりませんでした。現在、私はこれを持っています:

DelimitedFileEngine _engine = new DelimitedFileEngine(T);
_engine.WriteStream
        (HttpContext.Current.Response.Output, dataSource, int.MaxValue);

動作しますが、ヘッダーがありません。

のような属性を持ち、FieldTitleAttributeこれを列ヘッダーとして使用することを考えています。

それで、私の質問は、属性をチェックしてヘッダー列を挿入するのはどの時点ですか? 誰かが以前に似たようなことをしたことがありますか?

オブジェクトの各メンバーに属性を設定するだけで、ヘッダーを挿入し、実際のフィールド名とは異なるカスタム テキストを使用したいと考えています。

[FieldTitleAttribute("Custom Title")]
private string Name

また、生成時にヘッダーを挿入するようにエンジンに指示するオプションもあります。

そのため、WriteStreamorWriteStringが呼び出されると、ヘッダー行にカスタム タイトルが挿入されます。

DelimitedFileEngine のイベントをいくつか見つけましたが、現在のレコードが最初の行であるかどうかを検出する最良の方法と、その前に行を挿入する方法はわかりません。

4

6 に答える 6

35

これを行うコードは次のとおりです:https ://gist.github.com/1391429

これを使用するには、フィールドをで装飾する必要があります[FieldOrder](とにかく優れたFileHelpersの練習)。使用法:

[DelimitedRecord(","), IgnoreFirst(1)]
public class Person
{
    // Must specify FieldOrder too
    [FieldOrder(1), FieldTitle("Name")]
    string name;

    [FieldOrder(2), FieldTitle("Age")]
    int age;
}

...

var engine = new FileHelperEngine<Person>
{
    HeaderText = typeof(Person).GetCsvHeader()
};

...

engine.WriteFile(@"C:\people.csv", people);

ただし、これに対するサポートは、FileHelpers自体に追加する必要があります。実装する前に答える必要がある、頭のてっぺんからいくつかの設計上の質問を考えることができます。

  • ファイルを読み取るとどうなりますか?Afaik FileHelpersは現在、すべて通常の列位置に基づいており、列名を無視します...しかし、すべての[FieldHeader]場所に属性がある場合は、ファイル内の列名とプロパティを一致させる必要がありますか?それらが一致しない場合、例外をスローする必要がありますか?序数の位置が列名と一致しない場合はどうなりますか?
  • データテーブルとして読み取る場合、A)フィールド名(現在のデザイン)、またはB)ソースファイルの列名、またはC)FieldTitle属性を使用する必要がありますか?
于 2011-11-24T14:13:50.243 に答える
23

これがまだ必要かどうかはわかりませんが、FileHelper の動作方法は次のとおりです。列のヘッダーを含めるには、ファイルと同じ方法でヘッダーを区切った文字列を定義する必要があります。たとえば、「|」区切り文字として:

 public const string HeaderLine = @"COLUMN1|COLUMN2|COLUMN3|...";

次に、エンジンを呼び出すとき:

DelimitedFileEngine _engine = new DelimitedFileEngine<T> { HeaderText = HeaderLine };

ヘッダーを書きたくない場合はHeaderText、エンジンに属性を設定しないでください。

于 2011-01-28T11:19:43.987 に答える
6
List<MyClass> myList = new List<MyClass>();
FileHelperEngine engine = new FileHelperEngine(typeof(MyClass));
String[] fieldNames = Array.ConvertAll<FieldInfo, String>(typeof(MyClass).GetFields(), delegate(FieldInfo fo) { return fo.Name; });
engine.HeaderText = String.Join(";", fieldNames);
engine.WriteFile(MapPath("MyClass.csv"), myList);
于 2013-12-09T10:11:00.077 に答える
1

FileHelperAsyncEngine を使用してこれを実現できることがわかりました。データが「outputData」型の「output」と呼ばれるリストであると仮定すると、次のようなコードを記述できます。

        FileHelperAsyncEngine outEngine = new FileHelperAsyncEngine(typeof(outputData));
        outEngine.HeaderText = "Header1, Header2, Header3";
        outEngine.BeginWriteFile(outputfile);
        foreach (outputData line in output){
            outEngine.WriteNext(line);
        }
        outEngine.Close();
于 2011-06-29T23:52:10.403 に答える