- PR -

csvファイルのソート(c#)

投稿者投稿内容
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-05-30 14:40
こんにちは。

混乱はしていないので安心してください

私としては、C#のDataTable型で取得してDataViewでソートさせることで、想馬さん
のソートをDBMSに任せる方法に近いやり方ができるかも、と思っていました。
で、想馬さんの「データベース(≒DBMS)を使う方法」だと、ソートするためにDBMSを導
入する必要があるかもなー…と思ったわけです。既に導入していればそれを利用すること
もできるかもしれませんが。
なので、DBMSを利用するか.NET Frameworkが持っているデータベース機能(と言っ
ちゃっていいんでしょうか)を利用するかの違いだけだと思います。

引用:

R・田中一郎さんの書き込み (2006-05-30 12:00) より:

DataTable ってデータベースのテーブルじゃなくても使えるんですよね?


こんな流れって前にも見たような…デジャヴ?

ソートして出力するサンプルだとこんな感じでしょうか。

コード:

    // テーブル設定
    DataTable dt = new DataTable();
    dt.Columns.Add("year", typeof(int));        // 入学年度
    dt.Columns.Add("name", typeof(string));     // 名前

    // データ登録
    dt.Rows.Add(1984, "R・田中一郎");
    dt.Rows.Add(1984, "あさの");
    dt.Rows.Add(1985, "天野小夜子");
    dt.Rows.Add(1987, "荒又");
    dt.Rows.Add(1984, "大戸島さんご");
    dt.Rows.Add(1984, "きしだ");
    dt.Rows.Add(1987, "国枝千里");
    dt.Rows.Add(1984, "西園寺えりか");
    dt.Rows.Add(1983, "鳥坂先輩");
    dt.Rows.Add(1986, "兵藤信");
    dt.Rows.Add(1987, "レオナルド根岸改めベンジャミン伊東");
    dt.Rows.Add(1984, "堀川椎子");
    dt.Rows.Add(1984, "曲垣剛");

    // 入学年度でソート
    dt.DefaultView.Sort = "year";

    // 出力
    foreach (DataRowView r in dt.DefaultView)
    {
        Console.WriteLine("{0}年度入学 {1}", r["year"], r["name"]);
    }


データ登録部をファイルから読み込みつつテーブル設定のColumnsも適宜Addしていく
…とかやると、私が提案した方法と似たような感じになるかもしれませんね。
参考文献(ぉ

引用:

yamasaさんの書き込み (2006-05-30 13:54) より:

それは間違い。
マージソートであれば、全レコードを主記憶上に持たなくてもソートできます。


私も思いましたが、基本的にと書いてあるので、unibonさんがオンメモリーじゃないとダメ
だと言っている訳ではないと思いますよ。
uken
会議室デビュー日: 2006/05/25
投稿数: 14
投稿日時: 2006-05-30 18:54
スレッド主です。
結局、クイックソートを使ってやってみたのですが、
ソート件数が多くなると再帰を使用しているためかメモリが足りませんのメッセージが出てしまいます。

そこで今度は前の書き込みにありましたDataTableを使ってやってみようと思うのですが、教えて下さい。
@初歩的なことをお聞きしたいのですが、
.netの経験が少ないのでDataTableの使い方がよく分からないので
参考になるサイトがあったら教えて下さい。
A複数のソートキーがあってもソートできますか?
(1番目の列でソートした後に2番目のソートキーでソートするとか)
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-05-30 19:16
出来ます。

こういうのは、MSDN見ると書いてありますよ。
http://msdn2.microsoft.com/ja-JP/library/system.data.dataview.sort.aspx

あとはクイックソートって自作されたのですか??
自作しなくても、ソート処理はArrayListだと出来ますよ。
最近そんな記事を見かけたので過去ログあさってみると
有益な情報があると思います。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-30 19:55
引用:

ぽぴ王子さんの書き込み (2006-05-30 14:40) より:

混乱はしていないので安心してください:D


はい、混乱したのは私です (__;)

引用:

ぽぴ王子さんの書き込み (2006-05-30 14:40) より:

引用:

R・田中一郎さんの書き込み (2006-05-30 12:00) より:

DataTable ってデータベースのテーブルじゃなくても使えるんですよね?


こんな流れって前にも見たような…デジャヴ?:lol:


きっと僕が見落としたんだと思います・・・
やはり可能なんですね。
わかりやすくて楽しいサンプルコードをありがとうございましたw

#ちなみに、ソートメソッドがクイックソートを使用していると最近知りました。

しかしスタック積みすぎてエラーとは、何件くらいのデータなんでしょう?(^^;
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-05-30 21:53
引用:

yamasaさんの書き込み (2006-05-30 13:54) より:
それは間違い。
マージソートであれば、全レコードを主記憶上に持たなくてもソートできます。


たしかにそれは正しいです。
もっとも、それだったら、ランダムアクセスのファイルでシークしっぱなしすれば、クイックソートであろうとどんなソートアルゴリズムであってもファイル上でソートできます。(通常、ファイルはシーケンシャルでアクセスするのが楽だから、マージソートはそれを利用しているにすぎません。)

引用:

ukenさんの書き込み (2006-05-30 18:54) より:
スレッド主です。
結局、クイックソートを使ってやってみたのですが、
ソート件数が多くなると再帰を使用しているためかメモリが足りませんのメッセージが出てしまいます。


クイックソートがスタック溢れになるというのは、対象となるデーターの並びが特異的なためだという理由が考えられます。しかし、これはマレなことです。意地悪にそういうデーターを与えない限り普通は起こることはそんなにないと思います。ほんとうにクイックソートのためのメモリー不足なのでしょうか?今は、どんなコードでソートされているのでしょうか?
また、これについて余談ですが、.NET に標準で付いているソートってクイックソートでしたっけ(たぶんそうなんですよね?)。Java だと標準がマージソートだったと思います(ここでのマージソートとはファイルを使うという意味ではなく単なるソートアルゴリズムのひとつとしてのマージソートという意味)。クイックソートよりはマージソートのほうが安定(stable)だし、データーが特異な並びであっても処理量があまり多くならない、という点で優れていると思うのですが、なぜ .NET はクイックソートに拘っているのでしょう?

引用:

ukenさんの書き込み (2006-05-30 18:54) より:
そこで今度は前の書き込みにありましたDataTableを使ってやってみようと思うのですが、教えて下さい。


これは、昔、(VB.NET ではない) VB にソート機能が標準で付いていないので、ListBox や ListView を使ってソートしていたようなことに相当するのではないでしょうか。昔ならばいざ知らず、今ならばそのようなまどろっこしいことをしないほうが良いのではないでしょうか。

#以下、あとで追加。
ビューに DataTable 関連を使うのならば、ついでにソートもその中でやっちゃうのも良いやりかたなのかな?(使ったことがないので分かりませんが。)

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}

[ メッセージ編集済み 編集者: unibon 編集日時 2006-05-30 21:57 ]
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-31 02:48
引用:

unibonさんの書き込み (2006-05-30 21:53) より:

また、これについて余談ですが、.NET に標準で付いているソートってクイックソートでしたっけ(たぶんそうなんですよね?)。Java だと標準がマージソートだったと思います


.NET標準というよりは、ソートメソッド内部のロジックがクイックソートということのようです。以前、何かで読んだと思うのですが、今探しても見つからない・・・

引用:

unibonさんの書き込み (2006-05-30 21:53) より:

クイックソートがスタック溢れになるというのは、対象となるデーターの並びが特異的なためだという理由が考えられます。しかし、これはマレなことです。意地悪にそういうデ


実際、ある程度安定した速度を出せるソートロジックは、一度対象のデータを舐めて、初期段階の整列具合がある程度整っていたらバブルソートや単純挿入法などの手法を用い、バラバラであればクイックやシェルソートを用いるのが一般的だと思われるのですが、真偽の程はわかりませんね。(あまり興味ないですしw)
ただ、常にクイックソートを用いたとしても、データ件数が増えれば積んでいくスタックの数が増えるのはある程度わかるのですが、1万件が倍の2万件になっても、積むスタックの数は1つ増えるだけなんですよね・・・
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-05-31 10:31
こんにちは。

引用:

R・田中一郎さんの書き込み (2006-05-31 02:48) より:

.NET標準というよりは、ソートメソッド内部のロジックがクイックソートということのようです。以前、何かで読んだと思うのですが、今探しても見つからない・・・


これでしょうか?
http://msdn2.microsoft.com/ja-JP/library/system.collections.arraylist.sort.aspx
ArrayList.Sort メソッドはクイックソートのようです。
…というか ArrayList に Sort メソッドがあるのをすっかり忘れていたよ

引用:

unibonさんの書き込み (2006-05-30 21:53) より:

これは、昔、(VB.NET ではない) VB にソート機能が標準で付いていないので、ListBox や ListView を使ってソートしていたようなことに相当するのではないでしょうか。昔ならばいざ知らず、今ならばそのようなまどろっこしいことをしないほうが良いのではないでしょうか。


すいません。DataTable を提案したのは私です orz
スレ主さんの最初の質問で
> c#でcsvファイルを読み込み、任意の項目でソートして出力する方法を教えて下さい。
とあったので、それなら項目ごとに分けてからソートするのがいいかも と思って
DataTable を提案しました。単にソートするだけなら ArrayList.Sort で良いですね。

スレ主さんがやったクイックソートが、自前でソートしたのか、それとも ArrayList.Sort メ
ソッドを使ったのかはわかりませんが、 Sort メソッドでメモリが足りなくなるとなると、
DataView.Sort プロパティも危ないかもしれませんね。

引用:

ukenさんの書き込み (2006-05-30 18:54) より:

(1)初歩的なことをお聞きしたいのですが、
.netの経験が少ないのでDataTableの使い方がよく分からないので
参考になるサイトがあったら教えて下さい。
(2)複数のソートキーがあってもソートできますか?
(1番目の列でソートした後に2番目のソートキーでソートするとか)


(機種依存文字が入っていたので修正しました)
(1)残念ながら私も参考になるサイトはわからないです。強いてあげるならば MSDN?
(2)これは MSDN の DataView.Sort プロパティの項を見ると書いてありますね。
(既に Kazuki さんが指摘してくださってましたね。どうもありがとうございます)

スキルアップ/キャリアアップ(JOB@IT)