Common Lisp의 Zstd 아카이브에서 라인 읽기

Common Lisp의 Zstd 아카이브에서 라인 읽기



Zstd 형식으로 압축된 큰 줄 구분 JSON 파일이 있습니다. 이 파일을 data.ndjson.zst라고 부르겠습니다.

내 프로그램이 파일을 한 줄씩 읽기를 원합니다. https://github.com/glv2/cl-zstd을 사용하여 파일에서 이진 스트림을 만들 수 있습니다. 그래도 이진 스트림의 read-line 함수를 실행할 수 있습니다. 따라서 바이너리 스트림을 Flexi-stream으로 래핑해야 합니다.

(ql:quickload 'flexi-streams)
(ql:quickload 'zstd)

(defpackage #:ex1
  (:use #:cl #:flexi-streams :zstd))
(in-package :ex1)

(with-open-file (f #P"data.ndjson.zst"
           :element-type '(unsigned-byte 8)
           :direction :input)
  (with-decompressing-stream (zstd-stream f)
    (let ((s (make-flexi-stream zstd-stream
                :external-format (make-external-format :utf-8))))
      (loop for line = (read-line s nil nil)
        until (null line)
        do (print line)))))


그 줄을 인쇄하는 것이 현실적인 예입니다. 따라서 (print line)을 실용적인 애플리케이션으로 대체할 수 있습니다. 예를 들어 JSON 라인을 구문 분석하고 책 제목을 추출할 수 있습니다.

좋은 웹페이지 즐겨찾기