Mam poniższy plik JSON:
{
"data": [
{
"displayName": "First Name",
"rank": 1,
"value": "VALUE"
},
{
"displayName": "Last Name",
"rank": 2,
"value": "VALUE"
},
{
"displayName": "Position",
"rank": 3,
"value": "VALUE"
},
{
"displayName": "Company Name",
"rank": 4,
"value": "VALUE"
},
{
"displayName": "Country",
"rank": 5,
"value": "VALUE"
},
]
}
Chciałbym mieć plik CSV w tym formacie:
First Name, Last Name, Position, Company Name, Country
VALUE, VALUE, VALUE, VALUE, VALUE, VALUE
Czy jest to możliwe tylko przy użyciu jq
? Nie mam żadnych umiejętności programistycznych.
Odpowiedzi:
jq ma filtr @csv do konwersji tablicy na ciąg CSV. Filtr ten uwzględnia większość zawiłości związanych z formatem CSV, zaczynając od przecinków osadzonych w polach. (jq 1.5 ma podobny filtr @tsv do generowania plików wartości rozdzielanych tabulatorami).
Oczywiście, jeśli wszystkie nagłówki i wartości są wolne od przecinków i podwójnych cudzysłowów, może nie być potrzeby używania filtra @csv. W przeciwnym razie prawdopodobnie lepiej byłoby go użyć.
Na przykład, jeśli „Company Name” to „Smith, Smith and Smith”, a inne wartości są takie, jak pokazano poniżej, wywołanie jq z opcją „-r” wygeneruje prawidłowy CSV:
źródło
Wolę, aby każdy rekord był wierszem w moim pliku CSV.
źródło
.value|tostring
zamiast.value
w powyższym przykładzie(.value|tostring)
jq -r
aby rozebrać cytatyBiorąc pod uwagę tylko ten plik, możesz zrobić coś takiego:
.
Operator wybiera się pola z obiektu / mieszania. Dlatego zaczynamy od.data
, który zwraca tablicę z zawartymi w niej danymi. Następnie dwukrotnie odwzorowujemy tablicę, najpierw wybierając displayName, a następnie wartość, dając nam dwie tablice z wartościami tylko tych kluczy. Dla każdej tablicy łączymy elementy za pomocą „,” tworząc dwie linie.-r
Argumentem mówijq
nie zacytować wynikające sznurki.Jeśli rzeczywisty plik jest dłuższy (tzn. Zawiera wpisy dla więcej niż jednej osoby), prawdopodobnie będziesz potrzebować czegoś bardziej skomplikowanego.
źródło
Trudno mi
jq
było owinąć głowę. Oto niektóre Ruby:Rubinowy parser JSON wytoczył kres wokół przecinka przed zamykającym nawias.
źródło
Ponieważ oznaczono to tagiem
python
i przyjęto nazwęjson
plikux.json
źródło
Chociaż musiałem usunąć ostatni przecinek z przykładowego wejścia, aby działało, ponieważ
jq
narzekałem na oczekiwanie innego elementu tablicy, to:...masz mnie...
Jak to działa w skrócie:
[]
formy pola indeksu i.dot
zapisu..[][].displayName
.[.[][].displayName], [.[][].value]
join(", ")
funkcji, aby połączyć je jako oddzielne jednostki.W rzeczywistości robienie
[.field]
jest tylko innym sposobem,map(.field)
ale jest to nieco bardziej szczegółowe, ponieważ określa poziom głębokości pobierania pożądanych danych.źródło