我想将我的 sqlite 数据从我的数据库转换为 JSON 格式。
我想使用这个语法:
sqlite3 -line members.db "SELECT * FROM members LIMIT 3"> members.txt
输出:
id = 1
fname = Leif
gname = Håkansson
genderid = 1
id = 2
fname = Yvonne
gname = Bergman
genderid = 2
id = 3
fname = Roger
gname = Sjöberg
genderid = 1
如何在 for 循环中使用漂亮且结构化的代码来做到这一点? (仅在 Bash 中)
我已经尝试了一些 awk 和 grep,但还没有取得很大的成功。
如果有一些提示会很好。
我想要类似这样的结果:
[
{
"id":1,
"fname":"Leif",
"gname":"Hakansson",
"genderid":1
},
{
"id":2,
"fname":"Yvonne",
"gname":"Bergman",
"genderid":2
},
{
"id":3,
"fname":"Roger",
"gname":"Sjberg",
"genderid":1
}
}
最佳答案
如果你的 sqlite3 是用 json1 扩展编译的(或者如果你可以获得一个带有 json1 扩展的 sqlite3 版本),那么你可以用它来生成 JSON 对象(每行一个 JSON 对象)。例如:
select json_object('id', id, 'fname', fname, 'gname', gname, 'genderid', genderid) ...
然后您可以使用 jq 等工具将对象流转换为对象数组,例如将 sqlite3 的输出通过管道传输到 jq -s .
。
(一个不那么麻烦的替代方法可能是使用 sqlite3 函数 json_array(),它会生成一个数组,您可以使用 jq 将其重新组合成一个对象。)
如果 json1 扩展不可用,那么您可以使用以下内容作为起点:
awk 'BEGIN { print "["; }
function out() {if (n++) {print ","}; if (line) {print "{" line "}"}; line="";}
function trim(x) { sub(/^ */, "", x); sub(/ *$/, "", x); return x; }
NF==0 { out(); next};
{if (line) {line = line ", " }
i=index($0,"=");
line = line "\"" trim(substr($0,1,i-1)) ": \"" substr($0, i+2) "\""}
END {out(); print "]"} '
或者,您可以使用以下 jq 脚本,它将出现在“=”的 RHS 上的数字字符串转换为数字:
def trim: sub("^ *"; "") | sub(" *$"; "");
def keyvalue: index("=") as $i
| {(.[0:$i] | trim): (.[$i+2:] | (tonumber? // .))};
[foreach (inputs, "") as $line ({object: false, seed: {} };
if ($line|trim) == "" then { object: .seed, seed : {} }
else {object: false,
seed: (.seed + ($line | keyvalue)) }
end;
.object | if . and (. != {}) then . else empty end ) ]
关于json - Bash sqlite3 行 |如何转换成JSON格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36048347/