2

.odsWindows で lua を使用してファイルを 1 行ずつ読みたいと思います。私が行っていたコードは、別のプラットフォームでは機能しましたが、Windows では機能しませんでした。そこで、コードを変更して何が起こっているかを確認しました。

local fhandler = io.open(path,"r")
print(pcall(fhandler.read,fhandler,"*l"))
print(pcall(fhandler.read,fhandler,"*l"))
print(pcall(fhandler.read,fhandler,"*l"))

私が得る出力は次のとおりです。

true <?xml version="1.0" encoding="UTF-8"?>
false function: 0x003d39e0
true :tc:opendocument:xmlns:script:1.0" [...] office:version="1.2">

そのため、コードは .ods ファイルの 2 行目で失敗します。ここで関数を返す理由はわかりませんpcallが、重要な部分は、「:tc:opendoc...」で始まる「3 行目」の内容が .ods ファイルの 2 行目に属していることです。2 行目の 1025 文字であると確信しています。

次のことが起こっていると思います: 行全体を読み取るために、1024 バイトの lua 内部バッファーが必要です。したがって、2 行目は 1024 番目の文字までしか読み取られず、おそらくバッファーがいっぱいになります。Lua は行の残りを読み続けます。これは、バッファが別の値に設定されている可能性がある他のプラットフォームでコードが機能する理由も説明できます。

次のように独自のバッファを指定することで、ファイルのチャンクを読み取ることができることを知っています。

fhandler:read(2048,"*l")

しかし、これは、ファイルを 2048 バイトのチャンクでインポートし、行末で停止しないため、ここでは役に立ちません。したがって、インポートされたデータを解析し、改行などを探す必要があります。

最後に、私の質問は次のとおりです。1024 バイトに設定できる、一度に読み取ることができる行の長さのための lua 内部バッファーはありますか? このバッファのサイズを変更するにはどうすればよいでしょうか?

4

0 に答える 0