VB.NETでダイアログを開いてcsvを読み込みたい

タグの編集
投稿者 いぬ  (学生) 投稿日時 2019/3/20 01:53:44
VB.NET超初心者です。初めて質問させていただきます。現在BMIの計算アプリを作っています。

そこでボタンをクリックしたらダイアログが表示されてcsvファイルを選択して開くとファイルが読み込まれ、datatableにセットされ、datagridviewに表示されるという機能を作りたいです。

ボタンを押すとダイアログが表示され、ファイルを選択して開くというところは下記のサイトを参照して出来たのですが、そのファイルをdatatableにセットし、datagridviewに表示するというのはどうすればよいか分かりません。ご教授お願いします。

https://dobon.net/vb/dotnet/form/openfiledialog.html
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/3/20 09:41:31
> 下記のサイトを参照して出来たのですが
そのサイトには、CSV形式のファイルをDataTableや配列等として取得する方法も
記載されていたと思いますが、そちらはお読みになっていますか?
https://dobon.net/vb/dotnet/file/readcsvfile.html


> ボタンを押すとダイアログが表示され、ファイルを選択して開くというところは
OpenFileDialog の機能は、「ファイル名を指定させること」だけなので、
ダイアログを表示させたかどうかは、さほど重要ではなさそうです。

たとえば
  Dim selectedFileName As String = ofd.FileName 'ファイル選択ダイアログからファイル名を得る 
というコードは、
  Dim selectedFileName As String = TextBox1.Text 'テキストボックスからファイル名を得る 
というコードと本質的には変わりありません。


今回の質問は、CSV ファイル名は既に取得できているけれども、
それをどのように読みだせば良いのか分からない、という状況なのだと思います。

CSV ファイルを読み取る方法には、沢山の手段があるのですが、
各手段は、「どのような CSV なのか」によっても適材適所が変わってきます。

①そのファイルの文字コードが何であるか、事前に分かっていますか?
 → ASCII、UTF-8、Shift_JIS など

②データ中に改行や「,」が含まれることを許容したいですか?

他にも色々取り決めは必要なのですが、差し当たって重要なのは上記 2 点。
改行や「,」を含まないデータであれば比較的簡単ですが、含む場合は難易度が上がります。

改行等を含む場合の手順については、DOBON! さんのところのサンプルが
最初の足掛かりになるかと思います。
投稿者 いぬ  (学生) 投稿日時 2019/3/21 01:20:01
ご回答ありがとうございます。

csvファイル自体は体重やBMIの簡単な表で文字コードはShift_JISで改行や「,」を含まないです。
また、csvファイルは下記のコードで読み取り、表示させることが出来たのですが、これだとあらかじめ指定したファイル名しか選択することができません。 どのようなコードを用いればファイルを選択したうえで表示させることができるでしょうか?

Public Class Cls_CSV2Table

        Public Function CsvToTable(d_FilePass As String) As DataTable

            'フルパスからディレクトリのみ取り出す
            Dim csv_Dir As String = System.IO.Path.GetDirectoryName(d_FilePass)
            'フルパスからディレクトリのみ取り出す
            Dim csv_File As String = System.IO.Path.GetFileName(d_FilePass)

            '接続文字列
            Dim conString As String =
            "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _
            + csv_Dir + ";Extensions=asc,csv,tab,txt;"
            Dim con As New System.Data.Odbc.OdbcConnection(conString)

            Dim commText As String = "SELECT * FROM [" + csv_File + "]"
            Dim my_Da As New System.Data.Odbc.OdbcDataAdapter(commText, con)

            'DataTableに格納する
            Dim my_Dt As New DataTable
            my_Da.Fill(my_Dt)

            Return my_Dt

        End Function


    End Class
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim class_csv2table As New Cls_CSV2Table
        Dim csv_Daityou As DataTable = class_csv2table.CsvToTable(”D:\BMI.csv")





        DataGridView1.AutoGenerateColumns = True ' ここを False にすると表示しない
        DataGridView1.DataSource = csv_Daityou

    End Sub
          

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/3/21 11:32:52
> Dim csv_Daityou As DataTable = class_csv2table.CsvToTable(”D:\BMI.csv")

ここの "D:\BMI.csv" の代わりに、先の私のコードでいうところの
selectedFileName を渡すだけで良いと思うのですが、そういうことではなく?
投稿者 (削除されました)  () 投稿日時 2019/3/21 11:32:54
(削除されました)
投稿者 (削除されました)  () 投稿日時 2019/3/21 23:32:33
(削除されました)
投稿者 いぬ  (社会人) 投稿日時 2019/3/22 00:30:07
>>魔界の仮面弁士さん
できました! ありがとうございました。