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

解決


たかみちえ  URL  2001-10-23 00:25:43  No: 74953

コードがやたらと長くなるため一部省略します^^;
  こんな関数を作ってみたんですけど、
当然ながら遅いんです。
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-23 00:28:02  No: 74954

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


たかみちえ  2001-10-23 00:29:55  No: 74955

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


こころ  URL  2001-10-23 09:15:29  No: 74956

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

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

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


たかみちえ  2001-10-25 03:19:17  No: 74957

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


こころ  URL  2001-10-25 07:58:35  No: 74958

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


たかみちえ  2001-10-26 01:53:39  No: 74959

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


たかみちえ  2001-10-27 05:36:20  No: 74960

やってみよう…はいいんですけど、
肝心の変換関数が間違っているらしく出来ません。
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-27 08:47:07  No: 74961

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


たかみちえ  2001-11-04 09:38:34  No: 74962

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

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


こころ  URL  2001-11-05 09:49:33  No: 74963

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

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


たかみちえ  2001-11-07 04:06:28  No: 74964

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


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

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






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