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

投稿時間:2003/03/20(Thu) 16:42
投稿者名:Turbo
Eメール:
URL :
タイトル:
テキストの読み飛ばしはできますか?
こんにちは。

今、40MB〜60MBくらいのテキストデータを読み込みまして、必要部分を変数/配列に格納する
ルーチンを作成してます。試しにテストしてみると、非常に時間がかかるため、
もっと処理時間を短縮できないか検討しているところです。

現在のコードは、一行ずつ読み込んで、行の先頭何文字かが任意の文字列に一致すると、
その行の一部を変数に格納するといった処理で実施してます。

(例)
    Line Input #FileNo, StrBuffer
    If (Left(StrBuffer, 7) = "Element" ) then
        ElementNo = Val(Mid(Strbuffer,11,5))
    End If

ある変数を上記方法で格納した後は、次に格納すべき変数は何行先にあるかは分かって
いるため、上記方法よりもっといい方法があるのではないかと感じてます。

何かいい方法はないでしょうか。
よろしくお願いします。

投稿時間:2003/03/20(Thu) 16:47
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: テキストの読み飛ばしはできますか?
ここのFileSystemObject関係のテキストファイルの指定行を瞬時に読込む
を応用されたらいかがでしょうか
 

投稿時間:2003/03/24(Mon) 10:03
投稿者名:Turbo
Eメール:
URL :
タイトル:
ありがとうございます。追加の質問ですが。
> ここのFileSystemObject関係のテキストファイルの指定行を瞬時に読込む
> を応用されたらいかがでしょうか
>  

ありがとうございます。あまりに画期的な機能に震えがきました。
こんな便利な方法があるのですね。知っていれば最初から使ってました。

早速、本手法を用いてコーディングし直しておりますが、また問題にぶつかりました。
今までは、
Do Until EOF(File_No)
    …
    Line Input #File_No, Strbuffer
    X = Val(Mid(StrBuffer, 11, 12))
    …
Loop
としてましたが、FileSystemObjectを使って書き直してます。
そうすると、Do 〜 Loopの部分はどうやって置き換えればいいのでしょうか。

またもうひとつ質問ですが、プログレスバーを用いて進捗度を示したいと思ってます。
瞬時にファイルの行数を取得する方法は載ってましたが、今、何行目を読み込んでいるか
どうかは、行をカウントする変数を作成して、同機能を実現する必要があるのでしょうか。

以上の件、よろしくお願いします。

投稿時間:2003/03/24(Mon) 10:39
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: ありがとうございます。追加の質問ですが。
以下を試して見て下さい。
又ここの FileSystemObject関係の FileSystemObject オブジェクトについて の
TextStream オブジェクトのプロパティの一覧を見て下さい。

Private Sub Command1_Click()
'ファイルをオープンし一行ずつ読込んでテキストボックスに表示
    Dim Fso     As New FileSystemObject
    Dim FsoFile As TextStream
    Dim myText  As String
    Set FsoFile = Fso.OpenTextFile("Test.Txt")
    'ファイルのポインタがファイルの末尾の位置にある場合は(True)を返し
    'それ以外の場合は(False)を返します。
    With FsoFile
        Do Until .AtEndOfStream
            Select Case .Line
                Case 1, 3, 7, 9
                    myText = myText & .ReadLine & vbNewLine
            Case Else
                .SkipLine
           End Select
        Loop
    End With
    FsoFile.Close
    Text1.Text = myText
End Sub

投稿時間:2003/03/24(Mon) 11:11
投稿者名:Turbo
Eメール:
URL :
タイトル:
ありがとうございます。追加の質問2ですが。
ありがとうございます。
ご指摘いただいた本ホームページの項目を拝見しまして、両質問とも解決しました。
大変、助かりました。

実は、もうひとつだけ問題があります。
読み込むテキストファイルに下記のような記述部分があり、同部分を以下のコードで読み込む
ようにしてました。

'=== 読み込むテキストファイルの問題の記述部分 ===
'5桁ごとに5つずつ記述されています。実際はこんなにきれいな並びではありません。
'各数値は5桁になることはありません。→スペース区切りになっている。
  101  102  103  104  105
       …
9001 9002 9003 9004 9005

'=== 上記部分を読み込むコーディング ===
  Dim IntBuffer As Integer       '整数値の一時取込み変数
  For i = 1 To NumNcp            
      Input #File_No, IntBuffer  'テキストファイルでは"5i5"で記述されている
      NodCp(i) = IntBuffer       'NodCP()に格納

上記コーディング部ををFileSystemObjectを使って再現する場合は、ReadLineを使って
行全体を読込んだ後に、Mid関数等を用いてNodCpに格納するしか方法はないでしょうか?

以上の件、よろしくご教示いただけないでしょうか。

投稿時間:2003/03/24(Mon) 11:31
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: ありがとうございます。追加の質問2ですが。
> 上記コーディング部ををFileSystemObjectを使って再現する場合は、ReadLineを使って
> 行全体を読込んだ後に、Mid関数等を用いてNodCpに格納するしか方法はないでしょうか?

その辺はFileSystemObjectでも同じです。

そのような形式のファイルならランダムファイルで管理した方が簡単な
ような気がしますが。
当初テキストファイルと書いておられたのでFileSystemObjectを薦めたのですが
それは、固定長ファイルですよね!

投稿時間:2003/03/24(Mon) 12:49
投稿者名:Turbo
Eメール:
URL :
タイトル:
御礼。うまくいきました。
> > 上記コーディング部ををFileSystemObjectを使って再現する場合は、ReadLineを使って
> > 行全体を読込んだ後に、Mid関数等を用いてNodCpに格納するしか方法はないでしょうか?
>
> その辺はFileSystemObjectでも同じです。
>
> そのような形式のファイルならランダムファイルで管理した方が簡単な
> ような気がしますが。
> 当初テキストファイルと書いておられたのでFileSystemObjectを薦めたのですが
> それは、固定長ファイルですよね!

ありがとうございます。
うまくいくことを確認できました。

読み込むファイルは非常に乱雑な書式で、規則正しく並んでいるところもあれば
行の一部だけ必要な場合もあります。
大昔にFortranで作られたプログラムで、出力される計算結果ファイルが対象なのです。

まだ全部を変更してなくて実際のファイル読込みを行ってませんが、サンプルどおり、
高速読込み→配列・変数格納ができる事を期待して、今日中には完成するようにがんばります。

どうもありがとうございました。