TEXTファイルから1行づつ読むには。


おかちん  2008-03-19 23:58:19  No: 139362  IP: 192.*.*.*

TEXTファイルから1行づつよみこんで
変数に格納したいのですが、方法がわかりません。

編集 削除
やじゅ  2008-03-20 00:47:28  No: 139363  IP: 192.*.*.*

やりたいことをキーワードにして検索すればいいですよ
「VB6  テキストファイル  読む」

編集 削除
おかちん  2008-03-20 02:25:24  No: 139364  IP: 192.*.*.*

テキストファイルを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です、これ一行ずつ変数に格納したいんですが
よくわかりません。

編集 削除
通ってみた  2008-03-20 06:16:56  No: 139365  IP: 192.*.*.*

Line Inputを調べてみるとか

編集 削除
やじゅ  2008-03-20 08:37:39  No: 139366  IP: 192.*.*.*

VB6ではなく、VB2005ですね。環境は書いてください。
sbにすでに1行ずつ入っていますよ。
sb(0) '1行目
sb(1) '2行目

編集 削除
YuO  2008-03-20 13:41:18  No: 139367  IP: 192.*.*.*

行単位に分割してアクセス出来るようにしたい,ということでしょうか。
# 「一行ずつ変数に格納」ということの意図を掴めなかった。

だとすれば,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

編集 削除
さるべーじ  URL  2008-03-20 14:04:25  No: 139368  IP: 192.*.*.*

対象とするファイルがテキストで、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(ヘルプ)のサンプルコードも、学習にはお勧めしません。
あれは説明するトピックの使用例で、活用するのに最適なセオリーとなっていないことが
多いです。

編集 削除
YuO  2008-03-20 15:07:52  No: 139369  IP: 192.*.*.*

> ・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

編集 削除
さるべーじ  2008-03-20 18:57:58  No: 139370  IP: 192.*.*.*

> その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さんのような意見も
ここで説明する必要も私は感じません。

元質問者の方が「例外への対処の必要性」に気づいてくだされば、
私としては十分です。

編集 削除