如何解决Babashka处理JSON Lines文件时输出格式不符合预期的问题
解决方法
方案1:修改脚本主动打印输出
-i --stream参数下Babashka会自动序列化脚本每轮的返回值并打印,你只需主动打印生成的JSON字符串,再返回nil避免额外输出即可,修改script.clj如下:
(require '[cheshire.core :as json]) (let [in (json/parse-string *input* true) out (my-awesome-fn in)] (println (json/generate-string out)) nil)
原有bash命令无需修改,直接运行即可得到正确输出。
方案2:新增-r参数关闭自动序列化
不想修改脚本的话,直接给bb命令添加-r(raw output)参数,让Babashka原样输出返回的字符串,不做额外序列化:
cat in.jsons | bb -i --stream -r script.clj > out.jsons
原有script.clj无需任何修改。
方案3:手动读写流(适配大文件场景)
处理大体积JSON Lines文件时,可以放弃内置stream参数,自己逐行处理降低内存占用:
(require '[cheshire.core :as json] '[clojure.java.io :as io]) (with-open [reader (io/reader "in.jsons") writer (io/writer "out.jsons")] (doseq [line (line-seq reader)] (let [in (json/parse-string line true) out (my-awesome-fn in)] (json/generate-stream out writer) (.write writer "\n"))))
直接执行bb script.clj即可,不需要管道输入输出。
内容的提问来源于stack exchange,提问作者Patinside
相关产品推荐
相关产品推荐

