- - PR -
csvファイルのソート(c#)
«前のページへ
1|2|3|4
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-30 14:40
こんにちは。
混乱はしていないので安心してください 私としては、C#のDataTable型で取得してDataViewでソートさせることで、想馬さん のソートをDBMSに任せる方法に近いやり方ができるかも、と思っていました。 で、想馬さんの「データベース(≒DBMS)を使う方法」だと、ソートするためにDBMSを導 入する必要があるかもなー…と思ったわけです。既に導入していればそれを利用すること もできるかもしれませんが。 なので、DBMSを利用するか.NET Frameworkが持っているデータベース機能(と言っ ちゃっていいんでしょうか)を利用するかの違いだけだと思います。
こんな流れって前にも見たような…デジャヴ? ソートして出力するサンプルだとこんな感じでしょうか。
データ登録部をファイルから読み込みつつテーブル設定のColumnsも適宜Addしていく …とかやると、私が提案した方法と似たような感じになるかもしれませんね。 参考文献(ぉ
私も思いましたが、基本的にと書いてあるので、unibonさんがオンメモリーじゃないとダメ だと言っている訳ではないと思いますよ。 | ||||||||||||
|
投稿日時: 2006-05-30 18:54
スレッド主です。
結局、クイックソートを使ってやってみたのですが、 ソート件数が多くなると再帰を使用しているためかメモリが足りませんのメッセージが出てしまいます。 そこで今度は前の書き込みにありましたDataTableを使ってやってみようと思うのですが、教えて下さい。 @初歩的なことをお聞きしたいのですが、 .netの経験が少ないのでDataTableの使い方がよく分からないので 参考になるサイトがあったら教えて下さい。 A複数のソートキーがあってもソートできますか? (1番目の列でソートした後に2番目のソートキーでソートするとか) | ||||||||||||
|
投稿日時: 2006-05-30 19:16
出来ます。
こういうのは、MSDN見ると書いてありますよ。 http://msdn2.microsoft.com/ja-JP/library/system.data.dataview.sort.aspx あとはクイックソートって自作されたのですか?? 自作しなくても、ソート処理はArrayListだと出来ますよ。 最近そんな記事を見かけたので過去ログあさってみると 有益な情報があると思います。 | ||||||||||||
|
投稿日時: 2006-05-30 19:55
はい、混乱したのは私です (__;)
きっと僕が見落としたんだと思います・・・ やはり可能なんですね。 わかりやすくて楽しいサンプルコードをありがとうございましたw #ちなみに、ソートメソッドがクイックソートを使用していると最近知りました。 しかしスタック積みすぎてエラーとは、何件くらいのデータなんでしょう?(^^; | ||||||||||||
|
投稿日時: 2006-05-30 21:53
たしかにそれは正しいです。 もっとも、それだったら、ランダムアクセスのファイルでシークしっぱなしすれば、クイックソートであろうとどんなソートアルゴリズムであってもファイル上でソートできます。(通常、ファイルはシーケンシャルでアクセスするのが楽だから、マージソートはそれを利用しているにすぎません。)
クイックソートがスタック溢れになるというのは、対象となるデーターの並びが特異的なためだという理由が考えられます。しかし、これはマレなことです。意地悪にそういうデーターを与えない限り普通は起こることはそんなにないと思います。ほんとうにクイックソートのためのメモリー不足なのでしょうか?今は、どんなコードでソートされているのでしょうか? また、これについて余談ですが、.NET に標準で付いているソートってクイックソートでしたっけ(たぶんそうなんですよね?)。Java だと標準がマージソートだったと思います(ここでのマージソートとはファイルを使うという意味ではなく単なるソートアルゴリズムのひとつとしてのマージソートという意味)。クイックソートよりはマージソートのほうが安定(stable)だし、データーが特異な並びであっても処理量があまり多くならない、という点で優れていると思うのですが、なぜ .NET はクイックソートに拘っているのでしょう?
これは、昔、(VB.NET ではない) VB にソート機能が標準で付いていないので、ListBox や ListView を使ってソートしていたようなことに相当するのではないでしょうか。昔ならばいざ知らず、今ならばそのようなまどろっこしいことをしないほうが良いのではないでしょうか。 #以下、あとで追加。 ビューに DataTable 関連を使うのならば、ついでにソートもその中でやっちゃうのも良いやりかたなのかな?(使ったことがないので分かりませんが。) -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} [ メッセージ編集済み 編集者: unibon 編集日時 2006-05-30 21:57 ] | ||||||||||||
|
投稿日時: 2006-05-31 02:48
.NET標準というよりは、ソートメソッド内部のロジックがクイックソートということのようです。以前、何かで読んだと思うのですが、今探しても見つからない・・・
実際、ある程度安定した速度を出せるソートロジックは、一度対象のデータを舐めて、初期段階の整列具合がある程度整っていたらバブルソートや単純挿入法などの手法を用い、バラバラであればクイックやシェルソートを用いるのが一般的だと思われるのですが、真偽の程はわかりませんね。(あまり興味ないですしw) ただ、常にクイックソートを用いたとしても、データ件数が増えれば積んでいくスタックの数が増えるのはある程度わかるのですが、1万件が倍の2万件になっても、積むスタックの数は1つ増えるだけなんですよね・・・ | ||||||||||||
|
投稿日時: 2006-05-31 10:31
こんにちは。
これでしょうか? http://msdn2.microsoft.com/ja-JP/library/system.collections.arraylist.sort.aspx ArrayList.Sort メソッドはクイックソートのようです。 …というか ArrayList に Sort メソッドがあるのをすっかり忘れていたよ
すいません。DataTable を提案したのは私です orz スレ主さんの最初の質問で > c#でcsvファイルを読み込み、任意の項目でソートして出力する方法を教えて下さい。 とあったので、それなら項目ごとに分けてからソートするのがいいかも と思って DataTable を提案しました。単にソートするだけなら ArrayList.Sort で良いですね。 スレ主さんがやったクイックソートが、自前でソートしたのか、それとも ArrayList.Sort メ ソッドを使ったのかはわかりませんが、 Sort メソッドでメモリが足りなくなるとなると、 DataView.Sort プロパティも危ないかもしれませんね。
(機種依存文字が入っていたので修正しました) (1)残念ながら私も参考になるサイトはわからないです。強いてあげるならば MSDN? (2)これは MSDN の DataView.Sort プロパティの項を見ると書いてありますね。 (既に Kazuki さんが指摘してくださってましたね。どうもありがとうございます) |
«前のページへ
1|2|3|4