yq/pkg/yqlib/doc/usage/csv-tsv.md
Mike Farah 1421a5a879 wip
2023-04-12 19:04:21 +10:00

1.9 KiB

CSV

Encode/Decode/Roundtrip CSV and TSV files.

Encode

Currently supports arrays of homogenous flat objects, that is: no nesting and it assumes the first object has all the keys required:

- name: Bobo
  type: dog
- name: Fifi
  type: cat

As well as arrays of arrays of scalars (strings/numbers/booleans):

- [Bobo, dog]
- [Fifi, cat]

Decode

Decode assumes the first CSV/TSV row is the header row, and all rows beneath are the entries. The data will be coded into an array of objects, using the header rows as keys.

name,type
Bobo,dog
Fifi,cat

Encode CSV simple

Given a sample.yml file of:

- [i, like, csv]
- [because, excel, is, cool]

then

yq -o=csv sample.yml

will output

i,like,csv
because,excel,is,cool

Encode TSV simple

Given a sample.yml file of:

- [i, like, csv]
- [because, excel, is, cool]

then

yq -o=tsv sample.yml

will output

i	like	csv
because	excel	is	cool

Encode array of objects to csv

Given a sample.yml file of:

- name: Gary
  numberOfCats: 1
  likesApples: true
  height: 168.8
- name: Samantha's Rabbit
  numberOfCats: 2
  likesApples: false
  height: -188.8

then

yq -o=csv sample.yml

will output

name,numberOfCats,likesApples,height
Gary,1,true,168.8
Samantha's Rabbit,2,false,-188.8

Encode array of objects to custom csv format

Add the header row manually, then the we convert each object into an array of values - resulting in an array of arrays. Pick the columns and call the header whatever you like.

Given a sample.yml file of:

- name: Gary
  numberOfCats: 1
  likesApples: true
  height: 168.8
- name: Samantha's Rabbit
  numberOfCats: 2
  likesApples: false
  height: -188.8

then

yq -o=csv '[["Name", "Number of Cats"]] +  [.[] | [.name, .numberOfCats ]]' sample.yml

will output

Name,Number of Cats
Gary,1
Samantha's Rabbit,2