質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

8557閲覧

VB.NET CSVとデータテーブルについて

jjjssskkk

総合スコア13

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/04/20 05:55

編集2016/04/20 06:06

いつもお世話になっております。
現在課題としてVB.NETでCSVファイルを使った簡単な連絡先管理システムのようなものを作成しています。

機能としては、
1.既存のCSVファイルを読込み、リストボックスに番号、名前を一覧表示する
→あかさたな~でソートできるようにする
2.リストボックスの連絡先クリックでテキストボックスに詳細を表示
3.追加ボタンクリックで連絡先の新規追加
4.更新ボタンクリックで既存の連絡先の内容更新
5.削除ボタンクリックで既存の連絡先の削除
→いずれもCSVにデータを保存

を想定しています。

デザインはでき、本などを参考に配列を使い読込機能も実装したのですが、
ソートなどの機能を考えデータテーブルにデータを格納するようにとヒントをもらい、作り直すことにしました。
しかし、データテーブルの使い方について一日調べましたが方法も多くややこしくてイマイチ理解ができていません。

・CSVからデータを読込み、データテーブルに格納し、リストボックスに表示させるのにわかりやすい方法はありますでしょうか?

※CSVの内容は以下のようなかたちです。
0001,中山太朗,神奈川県,0000-00-0000,nakayama@aaa.com
0002,土田新太郎,新潟県,0120-00-1245,sdjnaidm@aaa.com
0003,中田三郎,富山県,0786-00-0000,fhsuw@aaa.com
0004,田中史郎,愛知県,0516-00-2652,aaaaa@aaa.com
0005,山田一郎,石川県,0585-58-5482,yamada@aaaa.com
0006,鈴木五郎,山梨県,0555-55-5555,suzuki@aaaa.com
0007,大田六郎,福岡県,5584-58-2541,oota@saaa.com

###現時点のソースコード

'フォーム Public Class AddressBookForm 'CSVファイルを読込みリストボックスに表示する Private Sub AddressBookForm_Load(sender As Object, e As EventArgs) Handles Me.Load Reading.ReadData() End Sub End Class '読込クラス Public Class Read 'アドレス帳の情報を格納する配列DBを作成 Private Structure DBField Dim Number As String Dim Name As String Dim Address As String Dim Tel As String Dim Mail As String End Structure Dim DB() As DBField ' 概要:CSVファイルを読込みリストボックスに表示する Public Sub ReadData() Dim lReader As New IO.StreamReader("C:\adoresu.txt", System.Text.Encoding.GetEncoding("Utf-8")) Try Do Until lReader.EndOfStream '全てのテキストを読み取るまで繰り返す Dim recordCount As Integer 'データの行数 If DB Is Nothing Then '配列が空なら上限値を0にして配列を作成。 recordCount = 0 Else recordCount = DB.GetUpperBound(0) + 1 '空でない場合は配列のサイズを一つ広げる End If ReDim Preserve DB(recordCount) Dim readFields() As String readFields = lReader.ReadLine.Split(",") '1行分のデータを読み取り、各フィールドに分解して代入 With DB(recordCount) 'DBの配列に代入 .Number = readFields(0) '番号 .Name = readFields(1) '名前 .Address = readFields(2) '住所 .Tel = readFields(3) '電話番号 .Mail = readFields(4) 'メールアドレス End With AddressBookForm.ListBox1.Items.Add(readFields(0) & " - " & readFields(1)) '番号と名前を-で結合 Loop Catch ex As Exception MessageBox.Show(ex.Message, "Read") Finally If lReader IsNot Nothing Then lReader.Close() lReader.Dispose() End If End Try End Sub End Class

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio 2012を使用しています。
そのほか必要な情報などございましたらご指摘お願いします。
たびたび似たような質問をするかもしれませんが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

テキストファイルの読み込みはFileIO.TextFieldParserを使うと楽できます

Microsoft.VisualBasic.FileIO >> TextFieldParser

あとたとえばこんな感じ(細々したところは適宜書きなおしてください)

vbnet

1Using stream As System.IO.FileStream = New System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read) 2 3 Using parser As FileIO.TextFieldParser = New FileIO.TextFieldParser(stream, IIf(encoding Is Nothing, System.Text.Encoding.UTF8, encoding), True, False) 4 5 With parser 6 .TextFieldType = FileIO.FieldType.Delimited 7 .Delimiters = New String() {","} 8 .HasFieldsEnclosedInQuotes = False 9 .TrimWhiteSpace = False 10 End With 11 12 While (parser.EndOfData = False) 13 14 Yield parser.ReadFields 15 16 End While 17 18 End Using 19 20End Using

で、読み込んだものをIEnumerable(Of String())として返すようにすれば、Linqも使えてさらに楽ができます
→例えば条件にあわないものを端から切り捨てたりとか

全体的な流れとしても、いまさらDataTableは使わずに、読み込んだレコードはObservableCollection(Of T)に突っ込んでおいて、DataGridなりListBoxにバインド、ソートなどの処理はLinqを使っていくような考えかたの方が個人的にはお勧めです(というか好きです)

System.Collections.ObjectModel >> ObservableCollection(Of T)

たぶんUIはWinFormsだと思いますが、もしWPFならコントロールにDataContextだったりItemsSourceがあるものが多いので、UIで凝ったことをしなければObservableCollection(Of T)にさえ突っ込んでおけば、ほとんどなにも考えずにできます(諸説あります)

投稿2016/04/20 07:51

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dojikko

2016/04/20 07:59

あとデータはINotifyPropertyChangedを継承したクラスで取り扱った方がUIと相性がよいと思います
guest

0

CSVからデータを読込み、データテーブルに格納し、
リストボックスに表示させるのにわかりやすい方法はありますでしょうか?

質問者さんの能力次第です。
ネット検索で、各種事例がみつかります。

案の掲示だけ、
1.VB.NET List(Of String) で検索できる事柄を使う
2.VB.NET Dictionary で検索できる事柄を使う
3.あくまでも、テキストとして扱う。
4.データベースへ、お引越しする。
CSV ← → データベース
は、結果として、その様に扱えれば良いだけです。
1~4の何れの方法でも、コントロールのDataSource になり得るデータになっていると、
後処理で、楽ができます。

投稿2016/04/20 06:10

編集2016/04/20 06:13
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ご回答いただきありがとうございました。
しかしながら知識不足のため教えていただいた内容が理解できず、なかなかうまくいきませんでした。
なんとか別の方法でデータテーブルを使うことができましたが、いただいた回答を参考にして理解できるよう勉強したいと思います。

投稿2016/04/22 01:35

jjjssskkk

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問