2015-05-27 14 views
5

Mam danych JSON strukturyzowanych następująco (mogą wystąpić pewne błędy tutaj, dane używam jest w porządku):Powershell convertfrom-json | ConvertTo-CSV

[{ 
"id": 12345, 
"itemName": "some string", 
"sellerId": 123, 
"seller": "", 
"categoryId": , 
"categoryPath": [ 
    { 
    //more data 
    }, 
    { 
    //more data 
    } 
]}, 
{"id": 12346, 
"itemName": "some other string", 
"sellerId": 234, 
"seller": "", 
"categoryId": , 
"categoryPath": [ 
    { 
    //more data 
    }, 
    { 
    //more data 
    } 
] 
}] 

Chciałbym przekonwertować go do pliku CSV, aby wybrany nazwy właściwości stają się nagłówkami CSV, a ich wartość (tylko głębokość 1) staje się danymi. np

id,itemName,sellerId 
12345,"some string",123 
12346,"some other string",234 

Próbowałem przy użyciu setki odmian

cat file.json | convertfrom-json | convertto-csv 

ale żaden z nich nie pracował. Dostaję tylko dane csv z nazwami/typami obiektów i nie mogę wymyślić, jak sprawić, by wykorzystywał tylko wybrane właściwości każdego obiektu z danych json.

+0

nie jest to ogromny wielkiego, ale dane wejściowe nie będzie pasować do Twojego wyjście próbki. – Matt

+0

Dzięki za wskazanie, sprawiłem, że wynik próbki pasuje do danych wejściowych. –

+1

Nie mogłem tego zrobić w jednym wierszu. Czy to działa dla ciebie? '$ convert = Get-Content file.json -raw | ConvertFrom-Json; $ convert | Wybierz id, itemName, sellerId | Convertto-CSV -NoTypeInformation'. Potrzebny do zapisania wyników do zmiennej najpierw z jakiegoś powodu, którego jeszcze nie znam. Działa dalej. – Matt

Odpowiedz

8

W skrócie trzeba zrobić coś takiego:

(Get-Content file.json -Raw | ConvertFrom-Json) | Select id,itemName,sellerId | Convertto-CSV -NoTypeInformation 

Pierwszym problemem było to, że Get-Content przechodził poszczególne linie ConvertFrom-Json który nie jest to, co chce. Użycie przełącznika -Raw przekazuje go w całości.

Numer (Get-Content file.json -Raw | ConvertFrom-Json) musi znajdować się w nawiasach, ponieważ pozwala nam kontynuować pracę z rurą. Właściwości nie są dostępne bez tego. Wygląda na to, że próbuje przekazać cały obiekt zamiast jego poszczególnych części w dół rury.

-NoTypeInformation usuwa linie jak to

#TYPE Selected.System.Management.Automation.PSCustomObject