TEXTファイルから1行づつよみこんで
変数に格納したいのですが、方法がわかりません。
やりたいことをキーワードにして検索すればいいですよ
「VB6 テキストファイル 読む」
テキストファイルを1行づつ読み込む
TextBox1.Clear()
Dim sr As New System.IO.StreamReader("..\..\test.txt", System.Text.Encoding.Default)
'読込むテキストファイルのバッファを確保(できれば少し多めに)
Dim sb As New System.Text.StringBuilder( _
CInt(New System.IO.FileInfo("..\..\test.txt").Length))
'ファイルの最後までループ
Do Until sr.Peek = -1
'1行づつ読込む(文字列の連結が高速に処理される)
sb.Append(sr.ReadLine & vbCrLf)
Loop
sr.Close()
'読込んだデータをテキストボックスに表示
TextBox1.Text = sb.ToString()
これなんですが2005です、これ一行ずつ変数に格納したいんですが
よくわかりません。
Line Inputを調べてみるとか
編集 削除VB6ではなく、VB2005ですね。環境は書いてください。
sbにすでに1行ずつ入っていますよ。
sb(0) '1行目
sb(1) '2行目
行単位に分割してアクセス出来るようにしたい,ということでしょうか。
# 「一行ずつ変数に格納」ということの意図を掴めなかった。
だとすれば,List(Of String)にAddしていけばよいです。
StringBuilderは単一の文字列を生成するために使うのものですので。
コンパイルすらしていないですが,とりあえずこんな感じで。
Dim lines As New List(Of String)
Using reader As New StreamReader("..\..\test.txt", System.Text.Encoding.Default, True)
Dim line As String
Do While True
line = reader.ReadLine()
If line Is Nothing Then Exit Do
lines.Add(line)
Loop
End Using
対象とするファイルがテキストで、CRLFで改行されているのであれば、
私なら以下のような方法を採ります。記述が簡単ですし、安全です。
Dim sb As String = ""
Using sr As New System.IO.StringReader(〜
Try
sb = sr.ReadToEnd 'テキストファイルを一気に読込
Catch ex As Exception
'例外発生時処理
End Try
End Using
Dim strLines() = Split(sb, vbCrLf) 'ここで一気に行単位に分解
YuOさんのようにList(Of T)を使うのが今風ですが、Splitを使うとループ要らずなので
個人的には配列を使っちゃいますね…。
---
ファイルのI/Oについては、ある程度セオリーが決まっています。
そのあたりをきちんと説明している入門書などをざっと通読して、まとめて把握して
おくと楽ですよ。
この場合、本を選ぶ時のポイントは
・VB2005に対応していること
・StringReaderとStreamReaderの使い分けが説明されている
・Read、ReadLine、ReadToEndの使い分けが説明されている
・Usingを推奨している
・Usingの中でのTry〜Catchの記述を推奨している
あたりになると思います。
このあたりをWebから拾って学ぼうとすると、古いバージョン向けのセオリーや、
薦めるべきではない悪手(またこれがどうどうと記述しているんですよ)にひっかかって
しまうことがあります。
また、msdn Library(ヘルプ)のサンプルコードも、学習にはお勧めしません。
あれは説明するトピックの使用例で、活用するのに最適なセオリーとなっていないことが
多いです。
> ・Usingの中でのTry〜Catchの記述を推奨している
そのCatch,実はUsingより外にあるべきものではないですか?
Usingの中でCatchして復旧可能で意味のあるものというのは,一般論として思いつきません。
# 読み込んでListに突っ込むだけの場合にCatchする意義のあるものは一切無いので,先のソースには書かなかった。
私は,Usingの中でTry-Catchしているような書籍であれば,逆にお勧めしません。
Catch節で何を書く事を想定しているのかは不明ですが,ログ出力やユーザーへの情報提供であれば,その責務は
System.Windows.Forms.Application.ThreadException イベント
にあると思います。
# System.ExceptionのCatchは再Throwする場合やInnerExceptionにくるんでThrowする場合を除き,明らかな悪手だと思いますが。
NAL-6295さんの名言「ゴールキーパー以外はハンドで反則ですよ」
http://d.hatena.ne.jp/NAL-6295/20050909/p1
> そのCatch,実はUsingより外にあるべきものではないですか?
あ、その方がいいですね。
Try
Using sr As New System.IO.StringReader(〜
sb = sr.ReadToEnd 'テキストファイルを一気に読込
End Using
Catch ex As Exception
'例外発生時処理
End Try
ので、
> ・Usingの中でのTry〜Catchの記述を推奨している
は撤回しておきます。
上述のコードで私が言いたかったことは、
ファイルI/Oは特に例外が発生しやすい部分なので、
学び始めから例外への対処は意識しておいた方がいい
ということが含まれます。
かといって、Catch句の詳細な説明をここでしようとは思いませんし、
ThreadExceptionイベントの存在やNAL-6295さんのような意見も
ここで説明する必要も私は感じません。
元質問者の方が「例外への対処の必要性」に気づいてくだされば、
私としては十分です。