専門家に聞いた!繰り返す痔の原因は!? >>

お世話になっています。VB.NET+CSVに関する質問です。
現在VB.NETで、CSVから読み込んだレコードをある項目を基準に並び替え、一覧にして画面に表示するというプログラムを作っています。

こういう場合のCSVから読み込んだデータの保持の方法と、その並び替えの方法にはどういうやり方がありますか?
いくつかのパターンがあると思いますが、教えてください。

以下はCSVの情報です。
・1行が1件のレコード
・項目1を昇順で並び替える
・CSV項目:項目1(半角英数字)項目2(タブ)項目3(半角・全角文字)
・CSV件数:1000行以下

このQ&Aに関連する最新のQ&A

A 回答 (5件)

すみません、ANo.3です。


もうちょっと書いておいた方が良いかもしれませんね。
私が書いている方法では、まずは、例えば構造体の配列等にCSVの内容を入れておきます。
で、IComparerを持つクラスの中で、比較したい構造体の「メンバを指定」しつつ
(ここが単純なSortメソッドでは不可能)比較し、大小関係を <0、=0、>0 で
指定してやれば良いです。
但しその際、Compareメソッド内で、比較する2値(Object型)を、該当の構造体に
変換してからでないと、比較できません。
CTypeかDirectCastで変換は可能かと思います。
…このぐらい書いておけば大丈夫かな?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
IComparerとても参考になりました。
ただ結局DataGridViewとDataTableの組み合わせで作ることになりました。

お礼日時:2008/06/08 11:13

No.1です。


ADO.NETが使えない制約って結構つらいですね。
では別解。
・SortedDictionary<string, List<string>>にデータを格納する。
第一引数が項目1の値で、List<string>にCSV項目を格納。
・VS2008ならList<string>にCSVデータを格納してLINQでSortする。
これでどうしょうか?

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/429 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
DataGridViewとDataTableの組み合わせで作ることになりました。

お礼日時:2008/06/08 11:15

下のURLなんかが参考になるかもです。


配列のソート方法を自分で設定する方法です。
2値の比較方法をIComparerインターフェイスを持つ自作クラスに定義し、
そのインスタンスをArray.Sortメソッドの第2引数にする事で、
自由にソート方法を定義できます。
ヘルプからも、ある程度の情報は取得できると思いますので、参照してみてください。

参考URL:http://www.atmarkit.co.jp/fdotnet/dotnettips/215 …
    • good
    • 0

SortedやSortのあるListboxやDataGridViewに読み込めは保持も並び替えも表示もできる。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
DataGridViewとDataTableの組み合わせで作ることになりました。

お礼日時:2008/06/08 11:16

私ならADO.NETで処理すると思います。


SQLで取得していたら並び替えが楽だと思います。
集計関数を使えるのもメリットになるでしょう。
VB.NETで処理しているサイトのリンクを張っておきます。
ご参考に。

参考URL:http://park5.wakwak.com/~weblab/selectTextFile.h …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
大変参考にななりました。ただ書き忘れていたんですが、
今回のプログラムではADO.NETを使うことができません。
それ以外の方法を教えてもらえると助かります。

お礼日時:2008/06/01 20:36

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qcsvファイル内にてソートする方法

ご協力お願いします。

あるログデータを取得したcsvファイルを作成しました。しかし、データ量も多く見やすいようにソートをかけたいのですが方法がわかりません。csvファイルの中身は以下のようになっています。
___________________________
| 端末ID | ユーザーID | 日付 | 時間 |
―――――――――――――――――――――――――
| ITD002 | 00000001 |2005/08/22| 11:00 |
―――――――――――――――――――――――――
| ITD002 | 00000003 |2005/08/22| 21:00 |
―――――――――――――――――――――――――
| ITD001 | 00000001 |2005/08/22| 12:00 |
―――――――――――――――――――――――――
| ITD001 | 00000002 |2005/08/22| 18:20 |
―――――――――――――――――――――――――
以上のような中身になっています。レコード量は、もっと多いです。このランダムな順番に取得したレコードを 端末ID(昇順)ユーザーID(昇順)日付(降順)時間(降順)でソートする方法をご教授お願いします。

ご協力お願いします。

あるログデータを取得したcsvファイルを作成しました。しかし、データ量も多く見やすいようにソートをかけたいのですが方法がわかりません。csvファイルの中身は以下のようになっています。
___________________________
| 端末ID | ユーザーID | 日付 | 時間 |
―――――――――――――――――――――――――
| ITD002 | 00000001 |2005/08/22| 11:00 |
―――――――――――――――――――――――――
| ITD002 | 00000003 |2005/08/22| 21:00 |
―――――――――――――――――――――...続きを読む

Aベストアンサー

ODBCドライバーに、テキストドライバーがあるので組み込み、
ソートするクエリを作成して、結果を出力してしまう。

ただし、別ファイルになりますので、どうしても同じファイルで、というなら
出力をワークとして作成後、元ファイルにコピーで上書き&ワーク削除する。

QVBAでcsvファイルを読み込んで並び順を変える方法

こんにちは。VBAについて質問させてください。
当方まだ勉強し始めたばかりのかなりの初心者です。
見当違いの質問かもしれません…
どなたかご教授よろしくお願い致します。


以下のようなcsvファイルがあります。

Andou,tokyo,25,
andou,aichi,16,
iijima,fukushima,22,
----以下略------


「名前」「出身地」「年齢」の順に
並んでいるだけのファイルです。
これを
「出身地」「年齢」「名前」の順に
並べ変えたいのですがどうしたら良いでしょうか?


(1)一度シートにcsvファイルを読み込む
(2)シート上で列をcut,pasteで並び替える

なら方法は分かるのですが、
csvファイルが物凄く長いため
シート上にcsvファイルを読み込めない状況です。
どうしたらよいのでしょうか?

何かアドバイスだけでもあれば教えて下さい。
なにとぞ宜しくお願い致します。

Aベストアンサー

エクセルで(長くて)読み込めないのだから、エクセルでやる必要もないと思います。
VBScriptで、
以下の様にconv.vbsとして保存して実行すると
data.cvsをdata_cnv.cvsとして変換出力します。
---------------------------------------------------------------
Dim fso, inf, outf, aLine, field, wk

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set inf = fso.OpenTextFile("data.csv",1)
Set outf = fso.OpenTextFile("data_cnv.csv",2,true)

Do until inf.AtEndOfStream
aLine = inf.ReadLine
field = split(aLine,",")
'列の並び替え
wk=field(0)
field(0)=field(1)
field(1)=field(2)
field(2)=wk
aline = join(field,",")
outf.WriteLine(aline)
Loop
inf.Close
outf.Close

エクセルで(長くて)読み込めないのだから、エクセルでやる必要もないと思います。
VBScriptで、
以下の様にconv.vbsとして保存して実行すると
data.cvsをdata_cnv.cvsとして変換出力します。
---------------------------------------------------------------
Dim fso, inf, outf, aLine, field, wk

Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set inf = fso.OpenTextFile("data.csv",1)
Set outf = fso.OpenTextFile("data_cnv.csv",2,true)

Do until inf.AtEndOfStream
...続きを読む

QSVNへ登録した際の「日時」について質問します。

SVNへ登録した際の「日時」について質問します。

SVNにファイルを最初に登録した際、ファイルの「日時」が登録時の日時になってしまいます。
ファイル自体のタイムスタンプを「日時」にできないでしょうか?

以上、よろしくお願い致します。

Aベストアンサー

リポジトリをダンプ→タイムスタンプの日時にコミットしたかのように編集→リポジトリにリストア
でやってやれないこともないでしょうが、それでリポジトリの整合性が保てるかは疑問です。

すくなくとも、例の6/10にコミットしたことにすると、6/10~現在までコミットされた他のリビジョンはすべて1増えることになります。
リビジョン指定の外部参照があったら、全て修正が必要です。
svn:keywordsでRevやIDを使っていて、それをAbout画面とかに利用しているのなら、再コンパイルが必要です。
Changelogに手書きでリビジョン番号を埋めこんでいたら、全て変更が必要です。


人気Q&Aランキング