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

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

ただいまの
回答率

88.62%

VB.net csvファイルを読み込んで配列に入れたいと思っています。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 8,245

mah1107

score 15

 構造体の配列に読み込んだcsvファイルを格納し、編集したい

何行あるか分からないファイルを一行ずつ読込んで、構造体の配列に入れたいと思っています。
OpenFileDialogでファイル名の取得は行っていますが、肝心の読み込みが出来ていません。
「VB.NET CSV 読み込み」などで検索したのですが、サンプルを見てもあまり理解できなかったので、質問させていただきます。

読み込むcsvファイルはX座標の値,Y座標の値,Z座標の値が入っています。
この値をそれぞれ配列で宣言し、各値のデータの処理を行いたいと考えています。
csvファイルのX座標とXpointを結びつけて、その平均をとる計算や
構造体で1つのグループとしてまとめて、指定した範囲に入る値の抽出などを行いたいです。

計算式等は頭の中でもう出来ていて、読み込みが出来ないので困っています。
配列を使えばcsvファイルの値とXpointなどを結び付けられるのでしょうか?
Importa system.ioやshift-jis等も調べたのですがあまり理解できていないです。

お願いばかりで申し訳ありませんが教えていただきたいと思います。
よろしくお願いします。

 発生している問題・エラーメッセージ

エラーメッセージ

 該当のソースコード

Public Class Form1

    'アプリケーションの終了
    Private Sub ExitButton_Click(sender As Object, e As EventArgs) Handles ExitButton.Click
        Application.Exit()
    End Sub

    '構造体の定義
    Public Structure PointData
        Dim Xpoint As Double  'X座標
        Dim Ypoint As Double 'Y座標
        Dim Zpoint As Double 'Z座標
    End Structure

    'メンバ変数
    Dim PD() As PointData

    'ファイルの読み込み
    Private Sub OpenButton_Click(sender As Object, e As EventArgs) Handles OpenButton.Click
        Try
            With OpenFileDialog1
                '選択ダイアログを開く。
                .Title = "点群ファイルの読み込み"
                .FileName = ""
                .Filter = "点群ファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*"
                .DefaultExt = ".csv"

                If .ShowDialog() = Windows.Forms.DialogResult.OK Then

                    '選択したファイル名を表示する。
                    OpenFileText.Text = IO.Path.GetFileName(.FileName)

                    'ファイルを読み込む。              
                    MessageBox.Show(.FileName & "を読み込みました。",
                                        My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning)

                Else
                    MessageBox.Show(.FileName & "の読み込みに失敗しました。",
                                        My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning)
                End If
            End With
        Catch ex As Exception
        End Try
    End Sub

End Class

 試したこと

ここに問題に対して試したことを記載してください。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

一行づつ読み込んで
その一行をsplitを使い カンマで分割すれば簡単に
ばらせます

単純に一行づつ読み込むサンプルです
引用ページ

   ' StreamReader の新しいインスタンスを生成する
    Dim cReader As New System.IO.StreamReader("C:\Hoge.txt", System.Text.Encoding.Default)

    ' 読み込んだ結果をすべて格納するための変数を宣言する
    Dim stResult As String = String.Empty

    ' 読み込みできる文字がなくなるまで繰り返す
    While (cReader.Peek() >= 0)
        ' ファイルを 1 行ずつ読み込む
        Dim stBuffer As String = cReader.ReadLine()
        ' 読み込んだものを追加で格納する
        stResult &= stBuffer & System.Environment.NewLine
    End While

    ' cReader を閉じる (正しくは オブジェクトの破棄を保証する を参照)
    cReader.Close()

    ' 結果を表示する
    MessageBox.Show(stResult)

ただし値がダブルクォーテーションとかで
囲まれていたり、各項目の列数が違う場合等は
一工夫必要ですが...

Vb.net自体は触ったことがないですが考えかたは使えると思うので...
stResult &= stBuffer & System.Environment.NewLine をやめて
dim stSplit as String()を宣言して
stSplit = stBuffer.Split(","c)として
受け取った後に各要素を別の変数に割り振ればいいと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/10 00:15

    まだ、解決していないようなので
    Vb.net で探してみました。

    このサンプルコードからならどうでしょうか?
    一応 Split も調べて乗っけておきました。

    キャンセル

  • 2018/11/10 00:45

    回答ありがとうございます。
    少しずつですが、理解が深まってきました!
    まだまだ初心者ですが、分かってるとやっぱり楽しいです。
    今後ともよろしくお願いします。

    キャンセル

  • 2018/11/10 01:44

    何かあれば 気軽に聴いてください
    余力があれば力になりたいと思います。

    キャンセル

+1

検索されたサンプルをそのまま動作させてみて、動きを確認されてはどうでしょう。
こちらは比較的シンプルですので、参考になるかと思います。
その際、デバッガでステップ実行して各変数の中身を確認されれば、そこから変更すべき場所が見えてくるかと思います。
その上で、ここが分からない等質問された方がよろしいかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/10 00:43

    ご丁寧に回答ありがとうございます。
    まだ自分自身どこがわかってどこがわかっていないのか不明点もありますので参考にしながら頑張りたいと思います。

    キャンセル

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

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

関連した質問

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