ql:qucikload xlsx は日本語のxlsxファイルに対応していない件について(2)
前回の記事ql:qucikload xlsx は日本語のxlsxファイルに対応していない件について
動作確認
Common Lispでquickload しているときは、どうやってファイルを変更すればいいんだっけ?とか久しぶりすぎてわからなくなっていた。 けれど、Common Lispはもっと自由な言語だったからそんなことしなくても確認できるのだった。
結局、 quickload
したときにはもう Lispのイメージにデータがはいっているんだから、そのまま get-entry
関数を上書きすればよかった。
(ql:quickload :xlsx) ; xlsx パッケージ読み込み (in-package :xlsx) ; xlsx パッケージに移動してからの get-entry関数を再定義(上書き) (defun get-entry (name zip) (let ((entry (zip:get-zipfile-entry name zip))) (when entry (xmls:parse (flex:octets-to-string (zip:zipfile-entry-contents entry) :external-format :utf-8))))) (in-package :cl-user) ; 元のパッケージに戻る (xlsx:sheet-names "xlsxファイル") ; 実行!
ヨシ!
メデタシメデタシ...じゃなかった
いや、まあ、いいんだけど、ファイル自体はなにも変更していない。
なのでもう一度 quickload
すると元の木阿弥。あら不思議元どおり。
次使うときもそれを同じことするの?
対応方法
ざっと考えるとこんな選択肢がある、はず。
:xlsx
パッケージってそんなに使わないから、まあ使う前にこの方法でイメージ書き換えればいい:xlsx
パッケージはquicklisp
で管理している、~/quicklisp/dists/quicklisp/software/xlsx-20180711-git/xlsx.lisp
にあるからこれを編集しておけばいい。:xlsx
パッケージのダウンロード元に patch を送ればいいよね。:xlsx
パッケージはもうあきらめてcl-xlsx
でよくない?
対応策1 イメージだけでOK
これはつまりもう何もしなくていい。おしまいコース。
対応策2 ローカルだけ編集
quicklisp
を使っているので、ソースコードはローカルのディレクトリにある。この場合は ~/quicklisp/software/xlsx-20180711-git/xlsx.lisp
を編集しておけばいい。
次回からは普通に (ql:quickload :xlsx)
でやってくれるはず。
それでうまくいかなかったら、~/quicklisp/local-projects
に :xlsx
を落せばいい。:xlsx
は gitlab.common-lisp.net から取得できる。
うーん。これ名前かぶらないかな。フォークした方がいいのかな。
対応策4 xlsx あきらめて cl-xlsx 使う?
これも quicklisp
を使っているので、~/quicklisp/local-projects
に :cl-xlsx
を落せばいい。:cl-xlsx
はcl-xlsxから落せるので。
# ソースコード取得 cd ~/quicklisp/local-projects git clone https://github.com/a1b10/cl-xlsx
(ql:quickload :cl-xlsx) (setq x (cl-xlsx:read-xlsx "/Users/dote/Downloads/JapaneseSheetName.xlsx"))
うん、普通にできるね。
これは :cl-xlsx
が XMLの処理に :cxml
というパッケージを使用していて、
:cxml
パッケージが文字コードとかの面倒をみてくれている。
よかった。よかっ