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

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

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

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

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

Q&A

解決済

1回答

2535閲覧

VB.net 読み込んだcsvファイルの列を削除したい。

mah1107

総合スコア15

Visual Basic .NET

Microsoft Visual Basic .NET (VB.NET)とはオブジェクト志向のプログラム言語です。 Microsoft"s Visual Basic 6 のバージョンアップとしてみることができますが、Microsoft.NET Frameworktによって動かされています。

VB.NET

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

0グッド

0クリップ

投稿2019/02/18 10:40

編集2019/02/19 03:16

前提・実現したいこと

お世話になっております。
VB.NETでOpenFileDialogを使ってCSV形式のファイルを読み込んだ際に、
CSVファイルの列を削除したいです。

現在、CSVファイルの読み込み・処理はできているのですが、処理で使用する値は13列目しか使用していません。
しかし、元データには6列目までデータが存在しており、読み込ませる前に4
6列目の値を全て削除しています。
この手間が面倒なので、CSVファイルを読み込んだ際に列を削除する方法を教えていただきたいです。

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

「String"X座標"から型’Double’への変換は無効です。」
とメッセージが表示されました。

データを確認したところ、1~3列目に文字列が存在しているため発生しております。
データを読み込んだ段階で存在している文字列を削除できますでしょうか?

該当のソースコード

vb.netを入力

1 'ファイルを開く 2 Private Sub OpenButton_Click(sender As Object, e As EventArgs) Handles OpenButton.Click 3 With OpenFileDialog1 4 '選択ダイアログを開く 5 .Title = "点群ファイルの読み込み" 6 .FileName = "" 7 .Filter = "点群ファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*" 8 .DefaultExt = ".csv" 9 10 'ファイル名の表示 11 Dim result As DialogResult 12 result = OpenFileDialog1.ShowDialog 13 If result = Windows.Forms.DialogResult.OK Then 14 OpenFileText.Text = .FileName 15 MessageBox.Show(.FileName & "を読み込みました。", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning) 16 17 'ファイルの読み込み 18 Try 19 Dim ReadItems() As String 'CSVの各項目を表す配列 20 21 'ファイルを開く。 22 Dim sr As New IO.StreamReader(.FileName, System.Text.Encoding.GetEncoding("Shift-JIS")) 23 24 'ファイルの最後までループ 25 Do Until sr.Peek() = -1 26 ReDim Preserve PD(PDCount) 27 ReadItems = Split(sr.ReadLine(), ",") 28 29 PD(PDCount).Xpoint = CDbl(ReadItems(0)) 30 PD(PDCount).Ypoint = CDbl(ReadItems(1)) 31 PD(PDCount).Zpoint = CDbl(ReadItems(2)) 32 33 'データ確認 34 Console.WriteLine(PD(PDCount).Xpoint & vbTab & PD(PDCount).Ypoint & vbTab & PD(PDCount).Zpoint) 35 PDCount += 1 36 Loop 37 38 Catch ex As Exception 39 MessageBox.Show(ex.Message) 40 End Try 41 42 Else 43 MessageBox.Show(.FileName & "ファイルの読み込みに失敗しました。", 44 My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning) 45 End If 46 End With 47 End Sub

試したこと

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

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

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

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

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

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

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

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

YAmaGNZ

2019/02/18 11:25

CSVに4列目以降のデータが存在してもコードは一切変化しないと思いますが、現状の何が面倒なのでしょうか?
toshi17922062

2019/02/18 11:28

>現在、CSVファイルの読み込み・処理はできているのですが、処理で使用する値は1~3列目しか使用していません。 >しかし、元データには6列目までデータが存在しており、読み込ませる前に4~6列目の値を全て削除しています。 と、ありますが、ソースによると、 ReadItems = Split(sr.ReadLine(), ",") で一行をカンマ区切りに分割し PD(PDCount).Xpoint = CDbl(ReadItems(0)) PD(PDCount).Ypoint = CDbl(ReadItems(1)) PD(PDCount).Zpoint = CDbl(ReadItems(2)) で、0,1,2番目の列のみ変数に取り込んでいます。 つまり読み込ませる前に何列あろうと、最初の3列しか使っていないのですが、他に何かしたいのでしょうか? もしかして、ここからこの3列のみで出力したいのであれば、このままこの変数の内容を別途CSVファイルとして出力すればよいだけだと思われます。
退会済みユーザー

退会済みユーザー

2019/02/18 12:12

他の方も指摘されているようですが、4 列目以降のデータは使わなければ済む話のように思えます。何が問題なのでしょう? あと、改行コードで一行を判定し、カンマで Split するのは、フィールドにそれらが含まれていると破綻します。CSV パーサーを使いましょう。
mah1107

2019/02/18 12:30

現状として皆さんのご指摘の通り1-3列のデータを変数として取り込んでおり、4列目以降のデータは使用していないため使用するに当たって問題はございません。 しかし、4列目以降のデータが存在するファイルを読み込んだ場合、適当なメッセージボックスが出てくるのでそれを無くしたいと思い投稿させていただきました。
mah1107

2019/02/18 12:33

おそらく文字や記号が4列目以降に存在するためメッセージボックスが出てきているのですが、3列目以降使用しないなら削除できないかなと考えてます。
YAmaGNZ

2019/02/18 13:06

それなら、どのようなメッセージボックスが出てるのか記述してください。 それが貴方が表示しているMessageBox.Show(ex.Message)であれば、エラーが発生していることになりますので、そのエラーメッセージを書いてください。
退会済みユーザー

退会済みユーザー

2019/02/18 14:39

「適当なメッセージボックス」って何ですか?
imihito

2019/02/18 22:52

Windows一般の話として、メッセージボックスで Ctrl+C を押せば、メッセージなどを文字としてコピーできます。 出てきたメッセージをコピーして、質問に追記して下さい。
退会済みユーザー

退会済みユーザー

2019/02/19 01:21 編集

たぶん、「適当なメッセージボックス」というのは以下の MessageBox ではないかと想像していますが、そうであれば以下の 2 行を削除(またはコメントアウト)したあと、デバッグ実行してエラーを再現し、どの行でエラーとなるのかとエラーメッセージを略さず正確にコピペして書いてください。 Catch ex As Exception MessageBox.Show(ex.Message)
mah1107

2019/02/19 03:22

皆様申し訳ございません。 発生している問題・エラーメッセージのところに情報を更新しました。 また、4-6列目についてはデータの有無に関わらず問題はございませんでした。 1-3列目のどこかに文字列が存在しているため、エラーが発生しており、そこから先の処理が行えないといった状況です。 今の現状を正確に把握せずに情報を伝えてしまい、申し訳ございません。
toshi17922062

2019/02/19 04:58 編集

>データを読み込んだ段階で存在している文字列を削除できますでしょうか? プログラムですから、いかように組むこともできると思いますが、寧ろその発生した行数(PDCount?)をエラーメッセージに表示して、元データを正すのが本筋ではないでしょうか? (そうしなくても、Console.WriteLineで確認もできてますが) 例えば、”12a34”と入力されていて、1234と変換されても問題ないですか?或いはCDblですから、12.34と変換していいのでしょうか? 入力エラーには様々なパターンが考えられますので、そのデータの信頼性には疑問が残りますよ。
shinami

2019/02/20 05:14

文字が含まれているのでDouble型への変換はできませんので文字として扱うしかないでしょう。 どのようなデータか分かりませんが商品コードなどでは5200という数字だけだったりU5200と頭に文字が付いていたりする事はあるので文字列として扱うしかないと思います。 または、誤って文字が入ってしまっているとか、本来は数字が入っているはずで計算などをするつもりであれば回答が出ている通り元データを正す方が望ましいのでしょう。
guest

回答1

0

ベストアンサー

「String"X座標"から型’Double’への変換は無効です。」とメッセージが表示されました。

どの行でエラーとなるのかを書くようにお願いしたはずですが・・・

質問にアップされているコードの以下の行で、ReadItems(0) が "X座標" という文字列になるということですか?

PD(PDCount).Xpoint = CDbl(ReadItems(0))

"X座標" というところから想像すると、問題の CSV ファイルは一行目がデータではなくヘッダーになっているのでは? メモ帳などで開いて中身を見ましたか?

"X座標" というような文字列が入っている行は単純にスキップして良いなら、Double.TryParse メソッドで Double にパースできるか否かを調べて、パースできなければ Continue してはいかがですか?

Double.TryParse メソッドの使い方は以下の記事が参考になると思います。

Double.TryParse Method
https://docs.microsoft.com/ja-jp/dotnet/api/system.double.tryparse?view=netframework-4.7.2

文字列が数値に変換できるか調べる
https://dobon.net/vb/dotnet/vb2cs/isnumeric.html

投稿2019/02/19 04:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問