アプリ版:「スタンプのみでお礼する」機能のリリースについて

点群データファイルより、任意の範囲の点データを取得し、
平均標高を求めるマクロを「Excel VBA」で作りました。
ただ、今回点群データファイル(CSVファイル)の改行コードが
「X,Y,Z(CR+LF)」から「X,Y,Z(LF)」に仕様変更になったため、
Line Inputステートメントで読み込めなくなりました。
Getステートメントで1バイトずつ読み込むように改変しましたが
今度は、点群データファイルの2GB制限により
「アドレスが不正です」のエラーメッセージが出てしまい、処理が中断してしまいます。
(なお、今回の解析要な点群データのファイルサイズは17GB超です。)

' バッファの初期化
strBuf = ""
Open "点群.csv" For Binary Access Read As #1
Do Until EOF(1)
  Get #1, , bytCode ' ここで中断
  If bytCode <> 10 Then
    ' LF以外の場合
    strBuf = strBuf & Chr(bytCode)
  Else
    ' LFの場合
    varBuf = Split(strBuf, ",")
    '
    .... (解析処理)
    ' バッファの初期化
    strBuf = ""
  End If
Loop
Close #1
'
.... (解析結果を出力)

まとめると、以下の条件のファイルを高速に読み込みたいです。
 1. 2GBを超えるCSVファイル
 2. 改行コードがLFのみ
サンプルプログラムを教えていただければありがたいです。
よろしくお願いいたします。

質問者からの補足コメント

  • つらい・・・

    tatsumaru77さん、銀鱗さん
    早速の回答ありがとうございます。

    作ったマクロですが、社内で共有してます。
    今までは、それこそマクロボタンをワンクリックで
    結果が得られるようにしてました。
    そういう訳で、他の社員に対して手順が増えたことを
    説明することがかなりハードルが高いです。
    (結局、私が全部介入することとなり、それも困難です。)

    今、CreateFileとReadFileを使ってできないか思考錯誤してますが
    現状まだ上手くいってません。。。。

    情報が不足していて申し訳ありません。

      補足日時:2023/10/07 19:48
  • HAPPY

    自己解決しました。皆さん、どうもありがうございます。

    17GB超の点群データ(CSVファイル,改行コードLFのみ)でしたが
    TextStreamクラスのReadLineメソッドで行単位取得ができました。
    処理も1時間35分あまりで、比較的に高速処理できていると思います。
    '
    set objFso = CreateObject("Scripting.FileSystemObject")
    set objTs = objFso.OpenTextFile(Filename:="点群.csv", IOMode:=1)
    '
    Do Until objTs.AtEndOfStream
      varBuf = Split(objTs.ReadLine , ",")
      '
      .... (解析)
    Loop
    '
    objTs = Nothing
    objFso = Nothing
    '
    .... (結果出力)

      補足日時:2023/10/08 14:48

A 回答 (2件)

改行コード変換ツールを使って、一旦、LFをCRLFに変換し、


そのファイルを今まで通りの方法で処理するのは、だめなのでしょうか。

改行コードコード変換ツールの1例です。
https://www.vector.co.jp/soft/winnt/util/se40651 …
    • good
    • 0

(´・ω・`) だったら1.8GBずつに分割して処理すれば良いと思うんだ。


同じ処理を10回繰り返すことになるけど、その方が回答を待つよりも早く処理が終わると思うよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A