명령줄에서 SQLite 출력을 JSON 형식으로 포맷하고 싶습니다. 현재 내 CSV 출력은 다음과 같습니다.
label1,value1
label2,value2
label3,value3
...
이제 다음과 같이 형식을 지정하고 싶습니다.
{'label1' : 'value1', 'label2': 'value2', ... }
감사해요!
답변1
저는 이것을 GNU로 테스트했습니다 awk
. sed
다른 버전에서도 마찬가지인지는 잘 모르겠습니다.
awk -F, '{printf "'\''%s'\'' : '\''%s'\'', ", $1, $2} END {print "}" }' input.csv | sed -e 's/^/{/' -e 's/, }/}/' > output.json
답변2
유효한 JSON은 큰따옴표를 사용하므로 다음과 같습니다.
awk -F, 'BEGIN{print "{"} {if (notfirst) {print ","}; print "\"" $1 "\":\"" $2 "\""; notfirst=1} END {print "\"\":\"\"}" }' input.csv
sed를 사용하지 않는 것이 더 쉽습니다
답변3
우리가 이것을 가지고 있다고 가정 해 봅시다 :
sqlite> .mode box
sqlite> SELECT * FROM mytable;
┌────────┬────────┐
│ field1 │ field2 │
├────────┼────────┤
│ label1 │ value1 │
│ label2 │ value2 │
│ label3 │ value3 │
└────────┴────────┘
...데이터를 JSON으로 추출하고 field1
필드 이름을 바꿀 key
수 있습니다 .field2
value
$ sqlite3 mydatabase.db '.mode json' 'SELECT field1 AS key, field2 AS value FROM mytable'
[{"key":"label1","value":"value1"},
{"key":"label2","value":"value2"},
{"key":"label3","value":"value3"}]
jq
필터를 통해 직접 수행하여 from_entries
필요한 출력을 생성할 수 있습니다.
$ sqlite3 mydatabase.db '.mode json' 'SELECT field1 AS key, field2 AS value FROM mytable' | jq from_entries
{
"label1": "value1",
"label2": "value2",
"label3": "value3"
}
알아채다필터링from_entries
jq
"항목" 배열, 즉 key
키 가 있는 객체가 필요합니다 value
.
SQLite가 JSON을 출력한 다음 해당 JSON을 처리하여 jq
따옴표, 줄 바꿈 및 기타 잠재적으로 문제가 있는 문자가 포함된 데이터를 올바르게 처리할 수 있도록 합니다.
sqlite> SELECT * FROM mytable;
┌─────────────────────┬────────────┐
│ field1 │ field2 │
├─────────────────────┼────────────┤
│ label1 │ value1 │
├─────────────────────┼────────────┤
│ label2 │ value2 │
├─────────────────────┼────────────┤
│ label3 │ value3 │
├─────────────────────┼────────────┤
│ label "with quotes" │ value with │
│ │ newline │
└─────────────────────┴────────────┘
$ sqlite3 mydatabase.db '.mode json' 'SELECT field1 AS key, field2 AS value FROM mytable' | jq from_entries
{
"label1": "value1",
"label2": "value2",
"label3": "value3",
"label \"with quotes\"": "value with\nnewline"
}
SQLite에서 활성화된 동안 SELECT 쿼리로 생성 된 기존 CSV 파일이 있는 경우에도 .mode csv
동일한 트릭을 사용하여 필드 이름을 바꾸고 key
먼저 value
Miller 를 사용하여 필드에 태그를 다시 지정함으로써 CSV에서 JSON으로 변환할 수 있습니다.from_entries
jq
$ mlr --c2j label key,value mydata.csv | jq from_entries
{
"label2": "value2",
"label3": "value3",
"label \"with quotes\"": "value with\nnewline"
}
헤더 행을 제거한 경우 제목 없는 CSV 입력을 표시 mlr
하도록 선택할 수 있습니다.-N
분명히, 이미 Miller를 사용하고 있다면 다음을 포함하지 않고도 모든 작업을 수행하도록 할 수 있습니다 jq
.
$ mlr --c2j label key,value then put -q 'end { emit @record } @record[$key] = $value' then cut -x -f key,value mydata.csv
[
{
"label2": "value2",
"label3": "value3",
"label \"with quotes\"": "value with\nnewline"
}
]
이렇게 하면 데이터를 읽고 mydata.csv
두 필드의 레이블을 다시 지정한 다음 key
각 입력 레코드의 필드 값에 따라 필드가 달라지는 새 레코드의 모든 데이터를 수집합니다. 그런 다음 두 개의 이니셜 key
과 value
필드를 제거하고 단일 JSON 개체가 포함된 배열로 출력을 만듭니다.