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

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

ただいまの
回答率

90.47%

  • VB.NET

    945questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,634

jjjssskkk

score 7

いつもお世話になっております。
現在課題として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を使用しています。
そのほか必要な情報などございましたらご指摘お願いします。
たびたび似たような質問をするかもしれませんが、よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

>CSVからデータを読込み、データテーブルに格納し、
>リストボックスに表示させるのにわかりやすい方法はありますでしょうか? 
質問者さんの能力次第です。
ネット検索で、各種事例がみつかります。

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

Microsoft.VisualBasic.FileIO >> TextFieldParser

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

Using stream As System.IO.FileStream = New System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read)

 Using parser As FileIO.TextFieldParser = New FileIO.TextFieldParser(stream, IIf(encoding Is Nothing, System.Text.Encoding.UTF8, encoding), True, False)

  With parser
   .TextFieldType = FileIO.FieldType.Delimited
   .Delimiters = New String() {","}
   .HasFieldsEnclosedInQuotes = False
   .TrimWhiteSpace = False
  End With

  While (parser.EndOfData = False)

   Yield parser.ReadFields

   End While

  End Using

End 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 16:59

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

    キャンセル

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VB.NET

    945questions

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