CSVファイルをデータグリッドビューに読み込み、抽出するには?

解決


ハーリー  2009-01-20 17:00:25  No: 141330  IP: 192.*.*.*

はじめまして、ハーリーです。VisualBasic2008ExpressEditionを使用しています。

さて、タイトル通りの質問になるのですが、今現在、書籍やインターネットを見てグリッドビューにcsv型式のファイルを読み込ませることはできました(「StreamReader」と記述しています)。

読み込んだ後に指定した文字のある行だけを残して他の行を消したい(できたら非表示)と思い、また調べていたのですが、mdbファイルを読み込んだときのやり方は書いてあったのですが、csv型式のファイルの時のやり方がのっていませんでした。

「データセット」のデータを「データグリッドビュー」に表示するというの記事も見つけたのですが、今まで本を見ながら記述してきたためか応用が利かず、「データセット」に読み込ませる方法も、読み込ませた後にどうやればいいかも見当が付きません…。


そこでみなさまに質問なのですが、csvファイルをデータグリッドビューに読み込んだときはどのようにすれば良いのでしょうか?
また、もしデータグリッドビューではできないとしたら、なにをすればできるようになりますか?

結果として私のしたいことは、一列目に「日付」、二列目に「種類」、三列目に「金額」を表示できるようにし、そこから「種類」が「食費」のものだけ表示させるようにしたいのです。

どなた様かご回答のほど、よろしくお願いします。

編集 削除
特攻隊長まるるう  2009-01-20 19:30:29  No: 141331  IP: 192.*.*.*

> グリッドビューにcsv型式のファイルを読み込ませることはできました(「StreamReader」と記述しています)。
StreamReader はテキストファイルを読むだけの機能しかないと思いますが、
そこから後、表示までの手順は?データセットは使わなかったんですか?

使ってるなら、そこから
> 「データセット」のデータを「データグリッドビュー」に表示するというの記事
に繋げれば良いだけかも?

編集 削除
ハーリー  2009-01-20 21:10:23  No: 141332  IP: 192.*.*.*

特攻隊長まるるう様、ありがとうございます。
読み取る部分は下のように記述してあります。

Dim line As String
Dim reader As New System.IO.StreamReader("C:\moneydata.csv", System.Text.Encoding.Default)
Do Until reader.EndOfStream
line = reader.ReadLine()
DataGridView1.Rows.Add(line.Split(","))
Loop
reader.Close()

フォーム上にあるのは「DataGridView1」のみです。
「DataGridView1」の部分を「データセット」にすればいいのかなと思い、
「Dim DataSet1 As New DataSet」と宣言し、
「DataSet1.Rows.Add(line.Split(","))」と記述したところ、
「Rowsはメンバでありません」とのエラーが。

自動的にメソッドなどを選べるみたいですが、どうも「DataSet」に使える「Row」みたいなものが見あたらなかったので、なにを選べば「DataSet1」にcsv型式のファイルを読み込むことができるのかわからない状態です。

それと、文節がカンマ区切りのメモ帳で作ったファイルのことをcsv型式と勝手に言っていました。間違えていたら訂正させてください…。

編集 削除
特攻隊長まるるう  2009-01-21 10:44:22  No: 141333  IP: 192.*.*.*

> それと、文節がカンマ区切りのメモ帳で作ったファイルのことをcsv型式と勝手に言っていました。
> 間違えていたら訂正させてください…。
用語に不安があるなら用語辞典で調べればいいのでは?
http://e-words.jp/w/CSV.html
CSVの正式な仕様書としては後に示すリンク先に説明されています。
> line.Split(",")
本来の CSV 型式には、このコードだけでは対応できないパターンがあります。
ただ、今回の質問内容ではありませんので割愛します。

> どうも「DataSet」に使える「Row」みたいなものが見あたらなかったので
DataSet は DataTable を複数格納する入れ物のことなので、データを直接格納する
場所はありません。
[DOBON.NET CSV形式のファイルをDataTableや配列等として取得する]
http://dobon.net/vb/dotnet/file/readcsvfile.html

データの型(数値とか文字列)の違いや、今後起こりそうな不具合を
無視して、最低限動くコードとしては、
        Dim ds As New DataSet
        Dim dt As New DataTable

        dt.Columns.Add()
        dt.Columns.Add()
        dt.Columns.Add()
        dt.Columns.Add()
        dt.Rows.Add("あ,い,う,え".Split(","c))

        ds.Tables.Add(dt)

編集 削除
オショウ  2009-01-21 21:12:31  No: 141334  IP: 192.*.*.*

MDBで行う方法があったのをご存じなのであれば・・・
OleDBでCSVファイルも開けますので、MDBへの接続を
CSVの接続に変更するだけで、そのまま流用可能かと。

あとは・・・Schima.ini をどうするか・・・

非表示と言うことは、ある法則で表示させない。
DB側からデータを抽出する際に、表示させたいものだ
け抽出するようにSQL文書けばよいだけ。

利便性やコード量から考えて、そう大差ないように、
思いますが・・・

以上。

編集 削除
ハーリー  2009-01-23 14:58:06  No: 141335  IP: 192.*.*.*

特攻隊長まるるうさん、オショウさん、ありがとうございます。

特攻隊長まるるうさんに例として挙げていただいたコードで、
データグリッドビューに表示するところまでいくことができました!
そして買った本をみて、
「データテーブルのデータを抽出、並べ替えする」
という部分を見ているのですが、
どうも自分のコードと違う部分があって、抽出ができない状態です。

本によると抽出するためにはデータビューを使うと言うことで、
データビューを新しく宣言し、
データテーブルを格納するとのことでした。
コードを見ると、
データビュー.Table = データセット.Tables("○○")
とありました。

しかし、自分のコード上で、
この「"○○"」に相当するものがわかりません。

Dim ds As New DataSet
Dim dt As New DataTable
dt.Columns.Add()
dt.Columns.Add()
dt.Columns.Add()
dt.Columns.Add()
dt.Columns.Add()

Dim line As String
Dim reader As New System.IO.StreamReader("C:\moneydata.csv", System.Text.Encoding.Default)

Do Until reader.EndOfStream
line = reader.ReadLine()
dt.Rows.Add(line.Split(","))
Loop
reader.Close()

ds.Tables.Add(dt)
DataGridView2.DataSource = dv.Table


としているのですが、
どのようにすればいいでしょうか。



>オショウさん
SQLというものも調べてみたのですが、
恥ずかしながらよく理解ができませんでした…。
なので、できたらVBでやりたいなと思っています。
すいません。

編集 削除
特攻隊長まるるう  2009-01-23 15:47:40  No: 141336  IP: 192.*.*.*

コードを選択状態にして[F1]キーを押すだけでヘルプ(MSDN)が
表示されるのですから、基本的なコードが分かったらまずは
そのコードの仕様を調査してください。

今のところ、データセットを使う必要が無いわけですが、
格納する時に何も指定しなければ、テーブル名は自動で
デフォルト値が指定されます。
テーブル名を事前に指定するか、インデックス指定で
取り出してデフォルト値を確認するか、もう、インデックス
指定で良いじゃんって。

それ以前に
データテーブルしか使わないなら、ds 使わないで dt
を直接使えば良いかと。

> SQLというものも調べてみたのですが
データビューのフィルタ処理に使う条件句の文法は
SQL と共通になります。結局、勉強することになると
思います。

編集 削除
ハーリー  2009-01-23 22:12:14  No: 141337  IP: 192.*.*.*

なんか説明されてるよりもっと簡単にできた(笑
おかげで時間かかってしまったわ(笑
ま、サンキューですた!

編集 削除