json을 csv로 변환하고 jq의 헤더로 변환

json을 csv로 변환하고 jq의 헤더로 변환

이 json을 변환할 수 있습니까?

[
    {
        "bytes": 276697,
        "checked": false
    },
    {
        "bytes": 276697,
        "checked": false
    }
]

jq에 헤더가 있는 테이블로?

나는 시도했다:

cat file.json | jq '.[] | join(",")'

그러나 헤더가 생략되었습니다.

"276697,false"
"276697,false"

그것은해야한다:

"bytes,checked"
"276697,false"
"276697,false"

두 가지 명령만 실행해 보세요.

cat file.json | jq '.[] | keys, .[] | join(",")'

그러나 두 번째는 실패합니다.

"bytes,checked"
jq: error (at <stdin>:64): Cannot iterate over null (null)

이상적으로는이것.

답변1

목록의 첫 번째 요소의 키에서 제목을 문자열 배열로 선택한 다음 모든 요소의 값을 별도의 배열로 추출할 수 있습니다. @csv결과 목록의 각 요소에 출력 연산자를 적용하면 CSV 형식의 데이터가 참조됩니다( jq모든 문자열, 부울이나 숫자 제외).

$ jq -r '[first|keys] + map([.[]]) | .[] | @csv' file
"bytes","checked"
276697,false
276697,false

또는,

$ jq -r '(first|keys), (.[]|[.[]]) | @csv' file
"bytes","checked"
276697,false
276697,false

또는,

$ jq -r '(first|keys), map(map(.))[] | @csv' file
"bytes","checked"
276697,false
276697,false

또는 값을 별도의 배열로 추출하는 다른 방법.

이는 입력 데이터 전체에서 동일한 순서로 나타나는 키에 의존한다는 점에 유의하세요.

그러나 사용하기가 더 쉽습니다.밀러( mlr):

$ mlr --j2c cat file
bytes,checked
276697,false
276697,false

이는 간단히 Miller의 명령을 통해 데이터를 전달하는 동시에 cat(이 방법을 사용하면 데이터가 수정되지 않음) 옵션 --j2c(약어 --ijson --ocsv)을 사용하여 데이터를 JSON에서 CSV로 변환합니다. Miller는 CSV를 올바르게 인식하므로 실제로 참조해야 하는 필드만 참조합니다.

다음 명령을 사용하여 예쁜 인쇄 출력 형식을 선택하여 올바른 형식의 테이블을 얻을 수도 있습니다 --barred.

$ mlr --j2p --barred cat file
+--------+---------+
| bytes  | checked |
+--------+---------+
| 276697 | false   |
| 276697 | false   |
+--------+---------+

( --j2pyes 의 약어입니다 --ijson --opprint.)

아니면 --barred:

$ mlr --j2p cat file
bytes  checked
276697 false
276697 false

답변2

알겠어요:

cat file.json | jq '(.[0] | keys), .[] | join(",")'

스트림을 "소비"하는 것을 방지하기 위해 괄호 안에 어떤 부분이라도 넣을 수 있는 것 같습니다(이것이 이름인지 또는 jq 문서에서 아무것도 찾을 수 없기 때문에 여기에 가져오는 것인지는 모르겠습니다. 그리고 거기에 다양한 블로그와 스택오버플로에 흩어져 있는 조각들로 모든 것을 하나로 묶는 작업이 필요하므로 이 작업을 수행하는 "올바른" 방법이 있다면 알려주시기 바랍니다.

그런데, 나와 같은 쉘 for 루프가 있는 경우 -s 옵션을 사용하여 별도의 json 개체를 결합합니다.

$ for i in {3,4,5,8} 
do rclone rc core/stats --rc-user USER --rc-pass PASS --rc-addr :557$i
done | jq -rs '(.[0] | keys), .[] | join(",")' | column -ts,

bytes      checks  deletedDirs  deletes  elapsedTime       errors  eta  fatalError  renames  retryError  speed               totalBytes  totalChecks  totalTransfers  transferTime  transfers
1660182    0       0            0        258038.009782457  0       0    false       0        false       1664.9322505627426  1660182     0            6               0             6
407752609  0       0            0        258038.054874325  0       0    false       0        false       10615.04533495996   407752609   0            86              0             86
7403585    0       0            0        258038.103563555  0       0    false       0        false       20892.381593377457  7403585     0            2               0             2
0          0       0            0        258038.156466825  0            false       0        false       0                   0           0            0               0             0

관련 정보