4

残念ながら動的な列構造を持つフラット ファイルがあります。値の階層に値があり、階層内の各層には独自の列があります。たとえば、フラット ファイルは次のようになります。

StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Tier3ObjectId|Status
1234|7890|abcd|efgh|ijkl|mnop|Pending
...

翌日の同じフィードは次のようになります。

StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Status
1234|7890|abcd|efgh|ijkl|Complete
...

問題は、私はすべての層についてあまり気にしないということです。最後の (下の) 層の ID と、層の列の一部ではない他のすべての行データのみを気にします。リレーショナル データベースに挿入するには、フィードをこれに似たものに正規化する必要があります。

StatisticID|FileId|ObjectId|Status
1234|7890|ijkl|Complete
...

最後の層のオブジェクト ID を決定し、説明されているようにデータを編成するための効率的で読みやすいメカニズムは何でしょうか? 私が行ったすべての試みは、私には不器用に感じます。

私がやったことのいくつか:

  • 正規表現パターンの列名を調べ、階層化された列を特定し、名前の降順で並べ替え、最初のレコードを選択しようとしました...しかし、この方法で序数の列番号を失うため、見えませんでした良い。
  • 参照するオブジェクトに必要な列を配置しましたIDictionary<string, int>が、動的列の序数を確実に収集することは問題であり、これはかなり非パフォーマンスになるようです。
4

3 に答える 3

0

個人的には、あなたのファイルを再フォーマットしようとはしません。最も簡単な方法は、各行を前後から解析することだと思います。例えば:

itemArray = getMyItems();
statisticId = itemArray[0];
fileId = itemArray[1];
//and so on for the rest of your pre-tier columns

//Then get the second to last column which will be the last tier
lastTierId = itemArray[itemArray.length -1];

最後の階層は常に最後から 2 番目になることがわかっているので、最後から始めて、先に進むことができます。これは、データファイルを再フォーマットしようとするよりもはるかに簡単なようです。

本当に新しいファイルを作成したい場合は、このアプローチを使用して、書き出すデータを取得できます。

于 2013-03-13T16:21:00.453 に答える
0

C#の構文はわかりませんが、次の行に沿った何か:

  1. 行を | で部分的に分割する 区切りとして
  2. [0]、[1]、[長さ - 2]、[長さ - 1] の部分を取得する
  3. パーツをデータベース処理コードに渡す
于 2013-03-13T16:34:46.440 に答える