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

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

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

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

Q&A

解決済

1回答

1912閲覧

textファイルを読み込み、置換後にcsvにする方法について

hainan

総合スコア31

VB.NET

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

0グッド

0クリップ

投稿2017/11/12 05:47

編集2017/11/12 05:49

いつも勉強させていただいております。
仕事でVB.NETの勉強をすることになり、参考書などで勉強している初心者です。

業務で気になった処理を、(勉強の意味が強いのですが)プログラム化できないかと思い
VBに関するサイトを見てまわったのですが、理解ができず
相談させていただきました。

※最終的にもっと違う形で作りたいとは思います

###前提・実現したいこと
不変型のテキストファイルを読み込み、いらない部分を削除(""を省くなど)したのち
csvファイルへ変換・保存したいと考えています。

1行ごとに取り出し、変換するところまでは理解ができたのですが
csvへ書き込む際の方法がわからず、質問させていただきました。

###問題点
・textファイルをcsvファイルに変換する際に、配列へ変換したのですが
この作業は不要かどうかがわかっておりません。
(```sbArray = Split(sb, ",")`` の部分です)

・1行ずつ変換して書き込みをする処理なので、

 「StreamWriter」で記載をしても処理が可能なのかわかりませんでした

(テストしてみたのですが、上手くできませんでした)

###該当のソースコード
ファイルは以下のような構成で、テキストファイルに格納されています。
行は100行ほどあり、全てが埋まっているのではなく、空白の項目もあります。

text

1A,"B","C","D","E","F","G","H","I","J","K","M"

VB.NET

1Public Class FailConversion 2 3 4 'ファイル選択ボタンを押したとき 5 Private Sub ChoiceBtn_Click(sender As Object, e As EventArgs) Handles ChoiceBtn.Click 6 7 'ファイルを開くダイアログを指定 8 Dim ofd As New OpenFileDialog 9 10 'ファイルの種類をtxtのみに指定 11 ofd.Filter = "テキスト文書(*.txt)|*.txt|すべてのファイル(*.*)|*.*" 12 13 'タイトルを設定 14 ofd.Title = "開くファイルを選択してください" 15 16 'OKを押した後にファイル名を表示 17 If ofd.ShowDialog() = DialogResult.OK Then 18 FileName.Text = ofd.FileName 19 End If 20 End Sub 21 22 'ファイル変換ボタンを押したとき 23 Private Sub ExecutionBtn_Click(sender As Object, e As EventArgs) Handles ExecutionBtn.Click 24 'ファイルのパス 25 Dim fp As String = FileName.Text 26 'ファイルを読み込みで開く 27 Dim sr As New System.IO.StreamReader(fp) 28 29 '一時ファイルを作成する 30 Dim tp As String = System.IO.Path.GetTempFileName() 31 '一時ファイル書き込みで開く 32 Dim sw As New System.IO.StreamWriter(tp) 33 34 35 'データ入力用の配列を設定 36 Dim sbArray As String 37 38 '読み込みできる文字がなくなるまで繰り返す 39 While (sr.Peek() >= 0) 40 41 '1行を読み込み、stringBuilderを作成する 42 Dim sb As New String(sr.ReadLine) 43 44 '区切り用の「""」を省き、空白へ変換 45 sb.Replace("""", "") 46 47 'データを分割する(sbArray配列へ変換) 48 sbArray = Split(sb, ",") 49 50 'データを一時的に配列へ保存 51 sw.WriteLine(sbArray) 52 53 54 End While 55 56 End Sub 57End Class 58

###補足情報(言語/FW/ツール等のバージョンなど)
PC:windows10 64bit
VB:Visual Studio2017

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/11/13 03:09

dobon.net の記事 http://dobon.net/vb/dotnet/file/readcsvfile.html の最初にある「CSV形式とは?」のセクションだけでいいので目を通してみてください。そのうえで、あなたの言う「いらない部分を削除(""を省くなど)」とか、Split(sb, ",") のように単純にカンマで分けて良いものかを考え、上記の質問を見直す必要があれば質問を書き直してください。
hainan

2017/11/13 10:14

ご指摘ありがとうございます。まだVBとCSVを理解しておらず、申し訳ないです。いただいた記事を確認し、変更してみます。お忙しいところありがとうございます!
guest

回答1

0

ベストアンサー

この作業は不要かどうかがわかっておりません。

この処理は

A,"B","C","D","E","F","G","H","I","J","K","M"

を、A,B,CMという複数の要素に分割しているものです。
例となりますが、配列の要素番号を弄れば、必ず、BAを入れ替えるという処理が可能になります。
sbArray(1) & sbArray(0)という感じで…

こういったことが不要であれば配列要素にする必要はありませんが、CSVを何らかの形に加工するのであれば
必要な処理だと推測されます。

ちなみに、提示されたソースですとsbArray = Split(sb, ",")はエラーとなります。
これは、受け取るsbArrayが文字列の配列ではなく単なる文字列として定義されている為で、対処するには下記の修正が必要となるでしょう。

Dim sbArray As String()'()をつける!

それと、実行すれば分かりますが、これではファイルにSystem.String[]が書き出されるだけです。

'データを一時的に配列へ保存 sw.WriteLine(sbArray) '???

CSVをCSVに変換しているのあまり、意味はありませんがサンプルソースを添付してみます。
ご参考までにご覧ください。

'ファイル変換ボタンを押したとき Private Sub ExecutionBtn_Click(sender As Object, e As EventArgs) Handles ExecutionBtn.Click 'ファイルのパス Dim fp As String = FileName.Text 'ファイルを読み込みで開く Dim sr As New System.IO.StreamReader(fp) '一時ファイルを作成する Dim tp As String = System.IO.Path.GetTempFileName() '一時ファイル書き込みで開く Dim sw As New System.IO.StreamWriter(tp) 'データ入力用の配列を設定 'Dim sbArray As String Dim sbArray As String() Dim test = sr.Peek() '読み込みできる文字がなくなるまで繰り返す While (sr.Peek() > -1) '1行を読み込み、stringBuilderを作成する Dim sb As New String(sr.ReadLine) '区切り用の「""」を省き、空白へ変換 Dim writeString = sb.Replace("""", "") 'リプレース後の文字列の格納先が無いとまずいので修正。 'データを分割する(sbArray配列へ変換) sbArray = Split(writeString, ",") 'データを一時的に配列へ保存 'sw.WriteLine(sbArray) '??? '例えば…(CSVにして書き出す)意味ないですが… For i = 0 To sbArray.Count - 1 'フィールドの取得 Dim field As String = sbArray(i).ToString() 'フィールドを書き込む sw.Write(field) 'カンマを書き込む If sbArray.Count - 1 > i Then sw.Write(","c) End If Next '改行する sw.Write(vbCrLf) End While sw.Close() 'ファイル閉じましょう! End Sub

投稿2017/11/13 03:08

motuo

総合スコア3027

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

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

hainan

2017/11/13 10:22 編集

確認が遅くなってしまい、申し訳ありません。 また、ご回答ありがとうございました! 質問内容にコメントいただいた、SurferOnWww さんにもご指摘いただいたのですが text ファイルと csvファイルは同一(互換性?)があるということを 初めて知りました・・・。 元々、text ファイルはcsvを変換していたものなので、 (質問に記載しておりませんが、別の加工はしたいので) いただいた内容をもとに、csvファイルから加工→別のファイルとして保存するような コードが作れるよう、もっと勉強していきたいと思います。 お忙しいところありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問