出来るだけ早くファイルを配列にしわけるには?

解決


たかみちえ  URL  2001-10-22 15:25:43  No: 74953  IP: [192.*.*.*]

コードがやたらと長くなるため一部省略します^^;
  こんな関数を作ってみたんですけど、
当然ながら遅いんです。
vbCrLfの個数をカウントして、行数を求める関数(LenLines)を
ファイル全体に向かって使っているので…。

Public Function SplitDocument(Document As String, PageLength As String)
    Dim TemDoc() As String, RetDoc() As String, i As Integer, e As Integer
    ReDim TemDoc(LenLines(Document)) As String
    ReDim RetDoc(Int(LenLines(Document) / PageLength)) As String
    TemDoc = Split(Document, vbCrLf)
    For e = 0 To UBound(RetDoc)
        For i = e * PageLength To e * PageLength + PageLength - 1
            If i = UBound(TemDoc) Then Exit For
            If i = e * PageLength Then RetDoc(e) = TemDoc(i) Else RetDoc(e) = RetDoc(e) & vbCrLf & TemDoc(i)
        Next
    Next
    SplitDocument = RetDoc
End Function

  せめて文章全体の行の数がすぐにわかれば、いくぶんか早くなりそうな気はするんですけど、
そんなAPIとかありませんか?あるような気がするんですけど…。

  ちなみにどこにも出力していないので、
SendMessageは使えないです…。

編集 削除
たかみちえ  2001-10-22 15:28:02  No: 74954  IP: [192.*.*.*]

ああっと、上の関数の目的は、
1つのファイルを何行かごとで分割表示したら、表示もラクだし閲覧するぶんには使いやすいんじゃないかなと言うことで…。

編集 削除
たかみちえ  2001-10-22 15:29:55  No: 74955  IP: [192.*.*.*]

あああ、いちばん上のLenLinesを二回呼び出してるのは、
一回にすれば少しましになりますね…^^;

編集 削除
こころ  URL  2001-10-23 00:15:29  No: 74956  IP: [192.*.*.*]

う〜ん、そういうAPI聞いたことありませんねぇ・・・。
APIってあまり便利関数は提供してないので
たぶん、ないと思います。

文字列での演算は遅いので
できる限りバイト配列にした方が少しは速くなるかもしれませんね。

基本的には、一定量作って表示。
後は、裏で処理するしかないと思います。

編集 削除
たかみちえ  2001-10-24 18:19:17  No: 74957  IP: [192.*.*.*]

> できる限りバイト配列にした方が少しは速くなるかもしれませんね。
  つまり、バイナリで読みこんで、13,10(CRLF)を検索すればいいんでしょうか?
  でもjoinとかで戻してから検索すると、結局文字列演算になっちゃいますけど…。
  じゃなくて、instrとかとはまったく無縁な検索方法でっていうことですか?

編集 削除
こころ  URL  2001-10-24 22:58:35  No: 74958  IP: [192.*.*.*]

> でもjoinとかで戻してから検索すると、
> 結局文字列演算になっちゃいますけど…。
元データは文字列ってことなんでしょうか。
ファイルって書いてあったのでファイルをバイト配列に読み込んで
改行を検出したものから順番に文字列にしていけば良いかな、
って思ったんですが。

編集 削除
たかみちえ  2001-10-25 16:53:39  No: 74959  IP: [192.*.*.*]

うん…ファイルとは限らないので…。
  でも変換関数で変換すればいいんですね、
やってみます。ありがとうございました。

編集 削除
たかみちえ  2001-10-26 20:36:20  No: 74960  IP: [192.*.*.*]

やってみよう…はいいんですけど、
肝心の変換関数が間違っているらしく出来ません。
Public Function AsByte(bytecode As String)
    On Error Resume Next
    Dim s() As Byte
    s = StrConv(bytecode, vbFromUnicode)
    AsByte = s
End Function
  うーん、そんな関数ほかにありましたっけ…。

  まさか、s=bytecode  じゃあダメでしょうし…。

編集 削除
こころ  URL  2001-10-26 23:47:07  No: 74961  IP: [192.*.*.*]

RtlMoveMemoryを使ってはどうでしょう。
ポインタを渡してUnicode単位で処理すれば
文字列型の配列への分散も容易になります。
こちらで試した所、問題なく動作しました。

編集 削除
たかみちえ  2001-11-04 00:38:34  No: 74962  IP: [192.*.*.*]

ごめんなさい、ここだけ遅れてしまいました。
RtlMoveMemoryAPIの宣言がなかったです…。

  あ、でもそうそう、メモリ上にテキストボックスを作って、
そこからSendMessageでしらべればわかりますね、
そうそう、そうですよぉ、ありがとうございました♪

編集 削除
こころ  URL  2001-11-05 00:49:33  No: 74963  IP: [192.*.*.*]

SendMessageで解決しましたか。
できるだけ速くってことなので
RtlMoveMemoryをお薦めしたんですが・・・。

参考までにAPI宣言です。
巷ではCopyMemoryという名でAliasされていますが。
Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)

編集 削除
たかみちえ  2001-11-06 19:06:28  No: 74964  IP: [192.*.*.*]

そういえばsplitした時点でもうわかってるんですねぇ、ばかばか^^;

編集 削除