1

ファイルヘルパーを捨てて、自分でこれを行う必要があるかどうか疑問に思っています。設計された範囲を超えている可能性があると思います。

ユーザーが任意の csv ファイル (将来的には Excel ファイル) をアップロードできるようにしたいと考えています。最初の行にはヘッダーがあります

C1 C2 C3 C4 C5 C6

アップロードすると、次のようになります

C1、C2、C3、C4、C5、C6 a、b、c、d、e、f

ここで、ヘッダーを見て、基本的に特定のものを取り上げたいと思います。たとえば、私が欲しいC2, C3, C4.残りは私が気にしない余分な情報です。

誰かがこのヘッダーを持つファイルをアップロードする可能性があります

C1 C2 C3 C4

繰り返しますが、私は のみを探していC2, C3, C4ます。

私は複数のフォーマットを持つことができることを知っていますが、私が得ているのは、基本的に、任意の数のヘッダーを持つ任意のファイルをアップロードできるようにしたいということです (私が気にするすべての場合は 1000 になる可能性があります)。気にする(したがって、1000ヘッダーの場合、3つだけが必要な場合があります)

これは可能ですか?

編集

(shamp00のコメントに基づく)

私の目標は、可能な限り多くのデータを入力することですが、このようなケースが発生する可能性があります。C1、C2、C3が欲しい。彼らはC1、C3、C4のファイルを提供します。必要な 2 列のデータを取得しましたが、C2 がありません。

ここで、データを 2 つのテーブルに表示するという 2 つのアイデアがありました。表1にはC1、C2、C3があり、表2にはC1、C3、C4があり、基本的に表2にあるデータを取得し、適切なデータを予想される列に移動します。

このアプローチでは、基本的に「あなたは私が期待したものを 100% 与えてくれませんでした。今では、すべての行を私のフォーマットにフォーマットする必要があります」と言っています。

2 番目のアプローチは、1 つのテーブルで、できるだけ多くのデータを入力しようとします。

たとえば、ユーザーは C1、C3、C4 を含むファイルをアップロードします。それらは既知の 2 つの列であると判断しましたが、予想されるデータの全量はまだ得られていません。

したがって、すべての行を html テーブルに戻し、ヘッダーを付けてユーザーに表示します。

C1, C2, C3, C4

C1 は埋められ、C2 セルは空白 (これは私が欠落しているデータです)、C3 は埋められ、C4 は埋められます (このデータは予想外でしたが、実際にデータである可能性があることは誰にもわかりません)。 C2は保持する必要がありますが、ヘッダー名のスペルが間違っているため、プログラムはそれを理解できませんでした)。

次に、基本的に、C2 に別の場所または C4 から取得したデータを入力するだけです。

今では、期待されるすべての列ではなく、1 つの列に入力するだけで済みます。したがって、ある意味では、 MyClass が C1、C2、C3 であったような具体的なクラスが必要ですが、同時に、保持できるように動的にする必要がありますC4,C5.....Cn

私は常にC1、C2、C3を最初に表示し、残りの予期しないものはその後に表示され、javascriptの魔法と不足している情報を編集できるものを介して表示されます。何も欠けていなければ、編集するものは何も表示されません。

shamp00のコメントに基づいて、データをデータテーブルとして返す必要があるかどうか疑問に思っています(幸い、これはシステムクラスのようです。現在、コードはサービスレイヤーにあり、必要に応じてドメイン転送クラスを返していました)自分のコードを Web コード クラスのようなものから独立させておくため、動的クラスの FileHelpers を生成する方法を理解しようとしていたのはなぜか)。

次に、どういうわけか(まだ100%確実ではありませんが)、本当に興味のある3つの列がどこにあるかを追跡するだけで、どのデータが何であるかがわかります。

4

2 に答える 2

1

私はFileHelpersに精通していませんが、LogParser(http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=24659)と呼ばれるツールを使用して、あなたが説明したものと非常によく似た何かをしました。私自身の「DelimitedTextFileData」クラスと組み合わせて。FileHelpersが必要なことを実行しないと判断した場合は、次にLogParserを調べることをお勧めします。現在のプロジェクトではやり過ぎだとしても、将来のプロジェクトで知っておくべき優れたツールです。

LogParserは、CSVテキストファイルを含むさまざまなソースに対する「SQLのような」クエリを可能にするツールです。これはコマンドラインベースの.exeですが、.NETプロジェクトで参照できるAPIも付属しています。私の状況では、任意の文字で区切ることができるテキストファイルを扱っていたので、クラスのインスタンス化で区切り文字を指定できるように独自のクラスを開発し、単純なAPIを使用してより大きなLogParserAPIをタップしました。また、列の数(および名前)が不明なファイルを解析する必要があったため、カスタムクラスには、ファイルで見つかった列のリストを取得する関数があります。常にCSVを処理していて、必要な列が正確にわかっている場合は、これらの追加の手順を実行する必要がない場合があります。それでも、必要に応じて、カスタムクラスを共有できれば幸いです。

LogParserは、「SQLのような構文を使用して何でもクエリを実行できるようにする」ことを目的としており、Linqの目的の1つは同じことを行うことだと思いました。「LinqtoTextFile」ライブラリをオンラインで検索しましたか?そこに良いものがあれば、それはあなたの問題も解決するかもしれません。

于 2012-02-09T20:44:54.177 に答える
1

他の質問に対する私の回答で説明されているような手法を使用して、FileHelpers を使用できます。

ヘッダー行を読んで関連する列を判断し、それらの列のみを処理して結果をトラバースしDataTableます。

何かのようなもの

public class MyClass
{
    public string SomeImportantField { get; set; }
    public string SomeOtherField { get; set; }
    public string AnotherField { get; set; }
}

public IList<MyClass> GetObjectsFromStream(Stream stream)
{
    var cb = new DelimitedClassBuilder("temp", ",") { IgnoreFirstLines = 1, IgnoreEmptyLines = true, Delimiter = "," };
    var sr = new StreamReader(stream);
    var headerArray = sr.ReadLine().Split(',');
    foreach (var header in headerArray)
    {
        var fieldName = header.Replace("\"", "").Replace(" ", "");
        cb.AddField(fieldName, typeof(string));
    }

    var engine = new FileHelperEngine(cb.CreateRecordClass());

    List<MyClass> objects = new List<MyClass>();
    DataTable dt = engine.ReadStreamAsDT(sr);
    foreach (DataRow row in dt.Rows) // Loop over the rows.
    {
        MyClass myClass = new MyClass();
        for (int i = 0; i < row.ItemArray.Length; i++) // Loop over the items.
        {
            if (headerArray[i] == "ImportantField")
                myClass.SomeImportantField = row.ItemArray[i].ToString();
            if (headerArray[i] == "OtherField")
                myClass.SomeOtherField = row.ItemArray[i].ToString();
            if (headerArray[i] == "AnotherField")
                myClass.AnotherField = row.ItemArray[i].ToString();
            objects.Add(myClass);
        }
    }
    return objects;
}
于 2012-02-09T15:48:35.687 に答える