예측 데이터가 포함된 일부 json을 csv(gnuplot용)로 변환해야 합니다. 여러 json2csv 유틸리티를 사용해 보았습니다.
JSON 샘플:
{"cod":"200","message":0.006,"cnt":40,"list":[{"dt":1519333200,"main":{"temp":271.62,"temp_min":271.62,"temp_max":272.921,"pressure":1028.3,"sea_level":1037.2,"grnd_level":1028.3,"humidity":88,"temp_kf":-1.3},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":4.86,"deg":78.004},"rain":{},"snow":{},"sys":{"pod":"n"},"dt_txt":"2018-02-22 21:00:00"},{"dt":1519344000,"main":{"temp":271.22,"temp_min":271.22,"temp_max":272.193,"pressure":1028.11,"sea_level":1037.04,"grnd_level":1028.11,"humidity":100,"temp_kf":-0.98},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":4.52,"deg":80.0016},"rain":{},"snow":{},"sys":{"pod":"n"},"dt_txt":"2018-02-23 00:00:00"},
또한 아름다운 인쇄:
{
"cod": "200",
"message": 0.006,
"cnt": 40,
"list": [
{
"dt": 1519333200,
"main": {
"temp": 271.62,
"temp_min": 271.62,
"temp_max": 272.921,
"pressure": 1028.3,
"sea_level": 1037.2,
"grnd_level": 1028.3,
"humidity": 88,
"temp_kf": -1.3
},
"weather": [
{
"id": 800,
"main": "Clear",
"description": "clear sky",
"icon": "01n"
}
],
"clouds": {
"all": 0
},
"wind": {
"speed": 4.86,
"deg": 78.004
},
"rain": {},
"snow": {},
"sys": {
"pod": "n"
},
"dt_txt": "2018-02-22 21:00:00"
},
{
"dt": 1519344000,
"main": {
"temp": 271.22,
"temp_min": 271.22,
"temp_max": 272.193,
"pressure": 1028.11,
"sea_level": 1037.04,
"grnd_level": 1028.11,
"humidity": 100,
"temp_kf": -0.98
},
"weather": [
{
"id": 800,
"main": "Clear",
"description": "clear sky",
"icon": "01n"
}
],
"clouds": {
"all": 0
},
"wind": {
"speed": 4.52,
"deg": 80.0016
},
"rain": {},
"snow": {},
"sys": {
"pod": "n"
},
"dt_txt": "2018-02-23 00:00:00"
},
저는 json2csv를 사용하여 데이터를 평면화하고 처음 몇 개의 원하지 않는 필드를 제거했습니다.
1519333200 271.62 271.62 272.921 1028.3 1037.2 1028.3 88 -1.3 800 "Clear" "clear sky" "01n" 0 4.86 78.004 "{}" "{}" "n"
"2018-02-22 21:00:00" 1519344000 271.22 271.22 272.193 1028.11 1037.04 1028.11 100 -0.98 800 "Clear" "clear sky" "01n" 0 4.52 80.0016 "{}" "{}"
"n" "2018-02-23 00:00:00"
일반 텍스트 날짜(sed??) 다음에 새 행을 생성하거나 이상적으로 json을 csv로 직접 평면화해야 합니다.
답변1
정규식은 sed
이러한 유형의 작업에 적합하지 않지만 사용하기는 매우 간단합니다.jq
, JSON 처리 도구:
$ jq -r '.list[]|[.dt, .main[]] | @csv' < data.json
1519333200,271.62,271.62,272.921,1028.3,1037.2,1028.3,88,-1.3
1519344000,271.22,271.22,272.193,1028.11,1037.04,1028.11,100,-0.98
jq
JSON 데이터 스트림을 수신하고 이를 필터링하여 sed
텍스트가 아닌 구조화된 데이터와 유사한 필수 데이터를 추출합니다. 이 명령에는"목록" 배열의 각 요소( .list[]
)그리고"dt" 필드를 제거합니다( .dt
).~의내부의 물건그리고 "주" 개체( .main[]
)의 모든 항목을 배열에 넣은 다음 전체 개체를 배열합니다.CSV 행으로 변환( @csv
).
특정 필드에 관심이 있거나 순서를 변경하려는 경우 해당 필드를 나열할 수도 있습니다.
$ jq -r '.list[]|[.dt, .main.temp_min, .main.humidity] | @csv' < data.json
1519333200,271.62,88
1519344000,271.22,100
관심 있는 항목을 하나씩 나열하고 나머지 항목은 무시하세요.
데이터의 다른 부분에 대해 알고 싶다면 여기에 넣을 수도 있습니다. .clouds
해당 필드를 살펴 clouds
보거나 다음 명령을 사용하여 풍속 필드를 읽을 수 있습니다 .wind.speed
. 또는 항상 이름 앞에 -를 사용할 수 있습니다.이것은 jq
꽤 포괄적이다필요한 사용자 정의 동작을 위해.
답변2
Michael Homer의 훌륭한 답변에 간단히 추가하면 다음과 같습니다.
jq 표현식이 커지면 이를 사용하여 스크립트를 작성할 수 있습니다.
예:
$ cat mkweatherreport
#!/usr/bin/jq -rf
.list[] |
[
.dt,
.main.temp_min, # in Kelvin degrees
.main.humidity
] | @csv
그런 다음:
$ mkweatherreport f.json
1519333200,271.62,88
1519344000,271.22,100
답변3
먼저 배열의 요소를 추출한 다음 이를 CSV로 변환하는 list
것이 가장 쉽습니다 . jq
(개별 list
요소 추출)과 mlr
(이러한 요소를 편리한 방법으로 CSV로 변환)을 조합 하여 이 작업을 수행할 수 있습니다 .
$ jq '.list[]' file | mlr --j2c cat
dt,main.temp,main.temp_min,main.temp_max,main.pressure,main.sea_level,main.grnd_level,main.humidity,main.temp_kf,weather.1.id,weather.1.main,weather.1.description,weather.1.icon,clouds.all,wind.speed,wind.deg,rain,snow,sys.pod,dt_txt
1519333200,271.62,271.62,272.921,1028.3,1037.2,1028.3,88,-1.3,800,Clear,clear sky,01n,0,4.86,78.004,{},{},n,2018-02-22 21:00:00
1519344000,271.22,271.22,272.193,1028.11,1037.04,1028.11,100,-0.98,800,Clear,clear sky,01n,0,4.52,80.0016,{},{},n,2018-02-23 00:00:00
질문의 데이터(배열을 닫도록 수정됨)가 주어지면 호출은 jq
먼저 다음과 같은 결과를 생성합니다.
{"dt":1519333200,"main":{"temp":271.62,"temp_min":271.62,"temp_max":272.921,"pressure":1028.3,"sea_level":1037.2,"grnd_level":1028.3,"humidity":88,"temp_kf":-1.3},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":4.86,"deg":78.004},"rain":{},"snow":{},"sys":{"pod":"n"},"dt_txt":"2018-02-22 21:00:00"}
{"dt":1519344000,"main":{"temp":271.22,"temp_min":271.22,"temp_max":272.193,"pressure":1028.11,"sea_level":1037.04,"grnd_level":1028.11,"humidity":100,"temp_kf":-0.98},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01n"}],"clouds":{"all":0},"wind":{"speed":4.52,"deg":80.0016},"rain":{},"snow":{},"sys":{"pod":"n"},"dt_txt":"2018-02-23 00:00:00"}
그런 다음 Miller에 대한 호출은 이러한 개별 개체를 읽고 평면화한 다음 CSV( --j2c
즉,"JSON 읽기, CSV 쓰기", 축약형(최근 추가됨) --ijson --ocsv
).
표현식을 수정하여 jq
필요하지 않은 각 요소의 필드를 제거하거나 수정할 수 있습니다. list
예를 들어 하위 배열의 첫 번째 요소만 반환하려면 weather
를 사용할 수 있습니다 .list[] | .weather |= first
.