テキストファイルから一行ずつ表示させるには?


けん  2004-09-14 23:55:59  No: 116290

はじめまして。
例えばテキストファイルに
aaaaa
bbbbb
ccccc
と書いてあり、それをボタンをクリックするごとに、textに
aaaa。  bbbb。 cccc。と順番にその一行だけ表示をさせたいのですが、
どのようにすれば良いのでしょうか?
お願いします。


にょも  2004-09-15 01:44:14  No: 116291

オープンしたテキストファイルをLine Inputで読みこみ、
一つの配列にいれれば良いと思います。
あとはボタンをクリックする度に、配列の中身を順に表示させるだけですね。


にょも  2004-09-15 02:12:45  No: 116292

書き忘れました(^^;
一つの配列に格納すると言うのは、テキストファイルの行数によって
配列数を動的に増やす必要があります。
読みこみ部分のサンプルを書いてみましたのでご参考下さい

Open strFilePath For Input As intFileNo
Do Until EOF(intFileNo)
    ReDim Preserve strBuf(intI)      '←配列を動的に増やしている部分
    Line Input #intFileNo, strBuf(intI)
    intI = intI +1
Loop
Close intFreeNo


にょも  2004-09-15 02:21:09  No: 116293

Close intFreeNo

Close intFileNo
の間違いです。
失礼しましたm(__)m


けん  2004-09-15 05:21:26  No: 116294

お返事ありがとうございます。
ちょっと今はできないんですが、すぐに参考にしてみたいと思います。
丁寧な説明、本当にありがとうございました。
また何か、わからなくなったらお願いします。


Say  2004-09-15 05:36:45  No: 116295

配列に取り込むなら、
FileSystemObjectのTextStreamオブジェクトの
RealAllメソッドで一気読みして、
vbCrLfでSplitしたほうが簡単かも。


特攻隊長まるるう  2004-09-16 23:41:27  No: 116296

ReDim は既存の配列を解放し、同じランクを持つ配列を新規作成する
…という事で Preserve で配列の要素数だけコピー処理が発生して
遅くなる…と聞いた事があります。実際に…気になるほど大量の
データを扱ったことが無いので何とも言えませんが、処理が遅いよう
なら一考ください。


ねろ  2004-09-17 20:40:12  No: 116297

もともとこれは『ボタンをクリックして順番に表示する』
と言う仕様でしょ、そんなに件数が多くないと思いますが、
あんまり多いと腱鞘炎になってしまう。
私にはListBoxを使うしか思いつかないんですが。


特攻隊長まるるう  2004-09-18 03:02:09  No: 116298

>もともとこれは『ボタンをクリックして順番に表示する』
>と言う仕様でしょ、そんなに件数が多くないと思いますが、
>あんまり多いと腱鞘炎になってしまう。
その通りですね(^^;)まぁ、おまけの予備知識とスレッド上げ
の意味でしたので、それほど深い…というか質問の回答に不可欠
と思って書き込んだわけでは無いです。さらっと流して下さい(ー人ー)

まぁ20行ずつ送る(ボタン押下の関数を20回呼ぶ)ページ送りボタンを
用意したり、ボタンを押し続ける事で早送り機能を持たせたりはできる
と思いますが…。
表示しないでメモリに確保しておくなら、ローカルのレコードセットとか
連想配列とか…入れ物は色々あるので何が早いのか調べてみる価値は
あるかもしれませんね。


にょも  2004-09-18 03:49:08  No: 116299

>Preserveで配列の要素数だけコピー処理が発生して遅くなる
私自身、あまり大きなテキストを扱うことがなかったため、いつもさくっと
配列で処理させていました。(^^;

ちょっと興味が湧きましたので、時間を作って、大きなテキストファイルでの
処理速度の比較をやってみようかなあと思います。
まるるうさん、情報ありがとうございます(^^


ねろ  2004-09-18 06:48:36  No: 116300

>Preserve で配列の要素数だけコピー処理が発生して遅くなる
という書き込みがある事は知っていますが、まさかそこまではという気がします。
この件については以前かなり突っ込んだ事があります、やってみると判るのですが

Private Declare Function timeGetTime Lib "winmm.dll" () As Long
Dim a() As String
Private Sub Command1_Click()
    Dim t As Long
    Dim n As Long
    ReDim a(10000)    'はじめに確保
    t = timeGetTime
    For n = 1 To 10000
        a(n) = String(500, "A")  'Aを500個配列に
    Next
    Debug.Print timeGetTime - t
    
    t = timeGetTime
    ReDim a(0)
    For n = 1 To 10000
        ReDim Preserve a(UBound(a) + 1)  '一回づつ確保
        a(n) = String(500, "A")
    Next
    Debug.Print timeGetTime - t
End Sub
とやると結果は 31(msec)と94(msec)となり気になる程の差は出ません。
ただしループを10,000から100,000に増やすと私の環境ですが77,481回目で
ReDim Preserve a(UBound(a) + 1)の方はメモリーが足りない
というエラーメッセージが出ます。不思議なことにスワップが出来ないのです。
変です、なんとなくVBのバグの匂いがします。
   
そこで配列が足りなくなったらまとめて増やすという方法をとってみます
これだと時間も45(msec)とそこそこですし100,000回でエラーも出ません。
1,000,000まで増やしました、73秒かかりましたがエラーは出ません。
大きなデーターを配列に入れたい人にはお勧めかもしれません。
    
    Dim t As Long
    Dim n As Long
    ReDim a(0)
    t = timeGetTime
    On Error GoTo e
    For n = 1 To 10000
        a(n) = ""  'エラーを出させてまと確保
        a(n) = String(500, "A")
    Next
    Debug.Print timeGetTime - t
    Exit Sub
e:
    ReDim Preserve a(UBound(a) + 100)  '100個分確保
    Resume Next
上のプログラムを実行するとプログラムを停止後、他のプログラムを起動する時
スワップの領域開放の為かハードディスクに激しくアクセスします、ほっておけば
終わります。


特攻隊長まるるう  2004-09-21 20:12:31  No: 116301

これはボクにとってかなり貴重な情報&ソースでした(ノ゜▽゜)ノ
蛇足でも書きこんで良かったです。ねろさん有難う御座います。
参考にさせて頂きますm(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加