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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

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

解決済

2回答

8772閲覧

VB.netにてcsvファイルの特定箇所を抜いて保存したい。

gorimamu

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

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/21 08:52

編集2019/02/22 06:24

前提・実現したいこと

初めて質問させていただきます。
VB.netにてCSVファイルの特定箇所だけ抜いて保存したい場合はどのようにすれば良いでしょうか?

例えば”abc.csv”というファイルがあったとして、
その中身が
1: 458, 982, 568
2: 000, 000, 000
3: 458, 101, 259
4: 569, 000, 168
5: 000, 000, 000
6: 525, 458, 585
となっているとします。

このとき、1列目~3列目まで値が全て0である2行目と5行目を抜いて
1: 458, 982, 568
2: 458, 101, 259
3: 569, 000, 168
4: 525, 458, 585
のようにcsvファイルを保存したいです。

現在は、"SaveFileDialog"で保存を行っています。
恐れ入りますが、ご教示いただければ幸いです。

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

csvファイルの特定箇所を抜いて保存したいが、どうすれば良いのか分からない。

該当のソースコード

vb.net

1 'ファイルの保存 2 Private Sub SaveButton_Click(sender As Object, e As EventArgs) Handles SaveButton.Click 3 With SaveFileDialog1 4 '選択ダイアログを開く 5 .Title = "点群ファイルの書き込み" 6 .Filter = "点群ファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*" 7 .DefaultExt = ".csv" 8 9 Dim selectButton As DialogResult 10 Dim filename As String 11 12 'データの個数が0のときは何もしない 13 If DataCount = 0 Then 14 MessageBox.Show("データが登録されていないので保存できません。") 15 Exit Sub 16 End If 17 18 '名前をつけて保存 19 selectButton = SaveFileDialog1.ShowDialog() 20 filename = SaveFileDialog1.FileName 21 22 If selectButton = DialogResult.OK Then 23 Dim sw As IO.StreamWriter = Nothing 24 25 Try 26 'グリッドデータの保存 27 SaveFileText.Text = .FileName 28 sw = New IO.StreamWriter(filename, False, System.Text.Encoding.GetEncoding("Shift-JIS")) 29 30 For i As Integer = 0 To DataCount - 1 31 If 0 < DataA(i).A And 0 < DataB(i).B And 0 < DataC(i).C Then 32 sw.WriteLine(DataA(i).A & "," & DataB(i).B & "," & DataC(i).C) 33 End If 34 Next 35 36 Catch ex As Exception 37 MessageBox.Show(ex.Message) 38 Finally 39 'ファイルを閉じる 40 If sw IsNot Nothing Then 41 sw.Close() 42 sw.Dispose() 43 End If 44 End Try 45 End If 46 End With 47 End Sub

試したこと

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

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

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

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

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

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

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

shinami

2019/02/21 11:36

このソースで実行したらどうなりますでしょうか? DataA(i).AやDataB(i).BやDataC(i).Cがそれぞれ1列目、2列目、3列目と予想しますが、 ここにデータが入っていればある程度出来そうな気もします。 または、そうではなく訳が分からないので取り合えずDataA(i).Aなどと入力し赤い下波線が出ている状態でビルドエラーと出てしまう様な状況でしょうか?
gorimamu

2019/02/22 06:22

ご質問ありがとうございます。 DataA(i).A等は、それぞれ1列目から3列目までのデータです。 また、実際にデータは入っており、ビルドエラーなどは出ません。 ソースコードでは、 If 0 < DataA(i).A And 0 < DataB(i).B And 0 < DataC(i).C Thenとありますが、 これは、それぞれのデータで0を抜いて出力することを想定したのですが、 実際はシートに何も記載されていないCSVファイルが出力されています。 If 0 < DataA(i).A And 0 < DataB(i).B And 0 < DataC(i).C Thenを抜いた場合は、 1: 458, 982, 568 2: 000, 000, 000 3: 458, 101, 259 4: 569, 000, 168 5: 000, 000, 000 6: 525, 458, 585 と出力されます。
guest

回答2

0

ベストアンサー

いずれにしてもDataA(i).Aなどが良く分かりませんので。

VB.NET

1Imports System.IO 2Imports System.Text 3Public Class Form1 4 Private OpenFileDialog1 As New OpenFileDialog() 5 Private sr As StreamReader 6 Private sw As StreamWriter 7 Private FCopyName As String 'フォルダ階層とファイル名の末尾に2を追加した名前のパス 8 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 9 10 If OpenDlg() Then 11 FileCreate() 12 If DeleteSyori() Then 13 MessageBox.Show("書き込みました。", "メッセージ", MessageBoxButtons.OK, MessageBoxIcon.Information) 14 End If 15 End If 16 17 End Sub 18 19 Private Function OpenDlg() As Boolean 20 21 Dim okng As Boolean = True '開く=True、キャンセル=Falseを返す 22 23 With OpenFileDialog1 24 '選択ダイアログを開く 25 .Title = "点群ファイルの読み込み" 26 .FileName = "" 27 .Filter = "点群ファイル(*.csv)|*.csv|すべてのファイル(*.*)|*.*" 28 .DefaultExt = ".csv" 29 30 'ファイル名の表示 31 Dim result As DialogResult 32 result = OpenFileDialog1.ShowDialog 33 If result = Windows.Forms.DialogResult.OK Then 34 MessageBox.Show(.FileName & "を読み込みました。", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information) 35 36 Else 37 okng = False 38 MessageBox.Show(.FileName & "キャンセルが押されました。", 39 My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Warning) 40 End If 41 End With 42 43 Return okng 44 45 End Function 46 47 Private Sub FileCreate() 48 49 'オープンしたフォルダ階層とファイルのパスの末尾.csvの拡張子を削除 50 FCopyName = Replace(OpenFileDialog1.FileName, ".csv", "") 51 'ファイルパスの末尾に2.csvを追加 52 FCopyName &= "2.csv" 53 'File.Copy(OpenFileDialog1.FileName, FCopyName, True) 54 55 End Sub 56 57 Private Function DeleteSyori() As Boolean 58 59 Dim okng As Boolean = True '書き込み成功/失敗 60 Dim ReadItems() As String 'CSVの各項目を表す配列 61 Dim PDCount As Integer = 1 62 63 Try 64 sr = New StreamReader(OpenFileDialog1.FileName, Encoding.GetEncoding("Shift-JIS")) 65 'ファイルが無ければフォルダ内のファイル名の末尾に2を付けたファイル名で作成し、すでに存在していれば上書きする。 66 sw = New StreamWriter(FCopyName, False, Encoding.GetEncoding("Shift-JIS")) 67 68 '読み込んだファイルの最終行になるまで繰り返し 69 Do Until sr.Peek() = -1 70 ReadItems = Split(sr.ReadLine(), ",") '1行読み、ReadItemsの配列に書き込み 71 72#If DEBUG Then 73 'データ確認 74 Console.WriteLine(PDCount & ":" & ReadItems(0) & vbTab & ReadItems(1) & vbTab & ReadItems(2)) 75 PDCount += 1 '確認用 76#End If 77 78 '1列目が000でないかつ2列目が000でないかつ3列目が000でない場合ファイルに書き込む 79 If ReadItems(0) <> "000" And ReadItems(1) <> "000" And ReadItems(2) <> "000" Then 80 sw.WriteLine(ReadItems(0) & "," & ReadItems(1) & "," & ReadItems(2)) '実書き込み 81 End If 82 83 Loop 84 Catch ex As Exception 85 okng = False 86 MessageBox.Show(ex.Message & vbCrLf & ex.StackTrace) 87 Finally 88 'ファイルを閉じる 89 If sr IsNot Nothing Then 90 sr.Close() 91 sr.Dispose() 92 End If 93 If sw IsNot Nothing Then 94 sw.Close() 95 sw.Dispose() 96 End If 97 End Try 98 99 Return okng 100 101 End Function 102 103End Class

概要

ファイル名に2を追加したファイル名を作りその中に000を排除したものができます。
無ければ作り、すでに存在していれば上書きします。
読み込み用のファイルに上書きすれば良いのかと思いましたが、読み込み用のファイルは残ったままで新たに作るようにしています。

StreamReaderとStreamWriterはUsingEnd Usingを使う方法もあります。Close()処理は要らずEnd Usingの所でクローズされます。

また、既存のソースをある程度は残して作成しています。
また、CDblなどは私は普段使いませんが数字をDouble型に変換するので今は小数点もありませんし必要ないでしょう。

投稿2019/02/22 08:09

編集2019/02/22 08:30
shinami

総合スコア334

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

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

gorimamu

2019/02/22 08:20

回答ありがとうございます。 また、コードまでご丁寧に感謝いたします。 これを参考に少し自分で試して見たいと思います。
guest

0

  1. 読み込むCSVファイルをオープン
  2. 書き込むCSVファイルをオープン
  3. CSVファイルを1行読み込む
  4. ファイルが尽きたら8へ
  5. 1列目~3列目まで値が全て0なら3に戻る
  6. 1行保存
  7. 3に戻る
  8. 書き込みファイルクローズ
  9. 読み込みファイルクローズ

という手順で実装しましょう

投稿2019/02/21 08:57

編集2019/02/21 09:04
y_waiwai

総合スコア87774

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

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

gorimamu

2019/02/21 09:19

回答ありがとうございます。 質問なのですが、CSVファイルの1行づつの読み込みは、 Do Until sr.Peek() = -1 ReDim Preserve PD(DataCount) ReadItems = Split(sr.ReadLine(), ",") DataA(DataCount).A = CDbl(ReadItems(0)) DataB(DataCount).B = CDbl(ReadItems(1)) DataC(DataCount).C = CDbl(ReadItems(2)) Loop で行ったとして、⑤,⑥はどのように行ったらよいのでしょうか? 0なら③へ戻るというところで何を使ったらよいか教えていただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問