[リストへもどる]
一括表示

投稿時間:2003/04/28(Mon) 14:28
投稿者名:toku
Eメール:
URL :
タイトル:
テキストファイルから文字列抽出
ここの[FileSystemObject オブジェクト関係]-[テキストファイルの読込表示]
で、FileSystemObjectを使用すると、バイナリーの場合と同等に高速で
ファイル読込ができる事が解かりました。

それを参考に、ファイルの「読み込み開始位置」と「読み込む文字数」
を指定してファイル内の文字列を抽出したいと思い下記の様にしました。

質問1.「読み込み開始位置」の指定は、どうしたらいいのでしょうか?
質問2.読み込み開始位置からファイルの最後まで読む込む場合に必要な
    「ファイルの全文字数」の取得は、どうしたらいいのでしょうか?

以上、宜しくお願い致します。

Private Sub Command1_Click()
    Dim TxtFile As String
  Dim Fso  As New FileSystem
  Dim FsoTS As TextStream

    Dim lngReadLen As Long  '読み込む文字数
    Dim lngStart As Long    '読み込み開始位置

  TxtFile = App.Path & "\Test.Txt"
  RichTextBox1.Text = ""

  Set FsoTS = Fso.OpenTextFile(TxtFile)
  RichTextBox1.Text = FsoTS.Read(lngReadLen)
  FsoTS.Close
  Set FsoTS = Nothing
End Sub

投稿時間:2003/04/28(Mon) 15:06
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: テキストファイルから文字列抽出
FileSystemObject オブジェクトについて の TextStream オブジェクト の欄と
その下のURLのアドレスのリンク先を見て下さい。(使用例が載ってます)

Skip 系のメソッドで読み飛ばし Read 系のメソッドで読込です。

投稿時間:2003/04/28(Mon) 16:17
投稿者名:toku
Eメール:
URL :
タイトル:
Re^2: テキストファイルから文字列抽出
> FileSystemObject オブジェクトについて の TextStream オブジェクト の欄と
> その下のURLのアドレスのリンク先を見て下さい。(使用例が載ってます)
>
> Skip 系のメソッドで読み飛ばし Read 系のメソッドで読込です。

ありがとうございます、
読み込み開始位置は、FsoTS.Skip lngStart - 1 で、できました。

しかし、ファイルの全文字数を取得する方法がまだわかりません。
もう少しヒントを下さい。
お願いします。

投稿時間:2003/04/28(Mon) 19:29
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: テキストファイルから文字列抽出
リンクのMSの使用例を見なかったのですか?

使用例に少し追加しました。
Private Sub Command1_Click()
    Const ForReading = 1, ForWriting = 2
    Dim fso, f, SkipTextFile
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True)
    f.Write "1234567890あいうえお1234567890" & vbCrLf & "1234567890あいうえお1234567890"
    Set f = fso.OpenTextFile("c:\testfile.txt", ForReading)
    
    f.Skip (12) ’最初の読込位置までスキップ 
  'SkipTextFile = SkipTextFile  'この場合  うえお1234567890 ここまで

  '従って最後まで読込む場合最後の行まで繰返します。
    Do Until f.AtEndOfLine
        SkipTextFile = SkipTextFile & f.ReadLine
    Loop
    Debug.Print SkipTextFile
End Sub

この辺は通常のシーケンシャルファイルの Line Input を使った読込と同様ですよ
使用例が載っているのですから自分で色々試して見て下さい。

投稿時間:2003/04/28(Mon) 23:54
投稿者名:toku
Eメール:
URL :
タイトル:
Re^4: テキストファイルから文字列抽出
レスありがとうござおます。

ReadLineプロパティで1行毎に読んで行くと、Line Input の場合と同様に
読み込む行数(文字数)が大きくなると極端に遅くなる様です。

Readメソッドの様に高速に読み込むことは無理なんでしょうか?
ファイル全体の文字数が判れば、Readメソッドを使えるのですが。

投稿時間:2003/04/29(Tue) 00:25
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: テキストファイルから文字列抽出
> ファイル全体の文字数が判れば、Readメソッドを使えるのですが。

そのような必要がある場合は、ファイルを保存する時に、そういった情報も保存するなり
管理された方がいいかと思います。
なぜ、読み飛ばす必要があるのか知りませんが、最初の読込む位置は何を持って決めて
おられるのですか?
終了時、ウィンドウのサイズ等を保存するのと同じように必要情報を保存しておけば
いいかと思います。
又、何回もいってますが、自分で出来る範囲はまず試して見て下さい。
都度,都度人に尋ねていたのでは、応用も利かないし、進歩もしませんよ。
プログラムを作る楽しみは、工夫する事にあると思うのですが、

  SkipTextFile = f.Read(1000)
  SkipTextFile = f.Read(100000)
  SkipTextFile = f.Read(10000000)

私も、今、上記を試して見ましたが、エラーも出ないし一応取得できました。
ファイルの大きさ以上のサイズを設定しても問題ないようです。?(但し、実験の結果で
他に問題があるかどうかは解りません)

このように色々試して見なければ解らないかと思いますよ!

読込が遅いか早いかは、コードのチョッとした違いや色んなケースが考えられます。
環境や条件、OS等を具体的に記入しないと判断はできません。
又、ファイルサイズや最初の読込位置や読込速度等の条件があるなら、最初の質問の時に
きちんと書いておくべきかと思いますよ。
場合によっては一気に読込んでから最初の読み飛ばしの分だけ削除する等方法が色々
考えられます。どれが早いかは試して見ないと一概にどうとはいえませんが?

 

投稿時間:2003/04/29(Tue) 11:01
投稿者名:だい
Eメール:dee_basssist@hotmail.com
URL :
タイトル:
Re^5: テキストファイルから文字列抽出

ファイルシステムには行数や文字数という情報は保持されていません。
(バイト数ならあります)
どうしてもファイル全体の文字数を求めたければ、たとえば、
ReadAllメソッドとLen関数を使用することになります。
ご質問の件の要求仕様を満たすのであれば、
そこからMid関数で切り出したほうが話が早いかもしれません。

ご質問の件では、
読み出し位置と読み出す文字数は外部から与えられる(使用者がそれを知っている)わけですから、
正直に「指定された文字数」を信じてReadメソッドを使用してもよいのかもしれません。
(もちろん、エラーはトラップするべき)
ですので、何故、
>ファイル全体の文字数が判れば、Readメソッドを使えるのですが。
となるのかは文面からは読み取れませんでした。

また、Read(とりあえず大きな値)を行うのであれば、
FileLen関数の戻り値よりもファイル全体文字数が多くなることは現状ではありえませんから、
その値を利用することも可能かもしれません。

詳細はヘルプ以の当該項目を参照ください。
(1)FileLen関数
(2)ReadAllメソッド
(3)Len関数
(4)Mid関数