"Timestamp","Average","Unit" "2017-03-01T04:05:00Z","145.8","Count" "2017-03-01T10:35:00Z","182.2","Count" "2017-03-01T05:30:00Z","180.2","Count" #### use warnings; use strict; use Text::CSV; use JSON::MaybeXS; my $json = <<'END_JSON'; { "Datapoints": [ { "Timestamp": "2017-03-01T04:05:00Z", "Average": 145.80000000000001, "Unit": "Count" }, { "Timestamp": "2017-03-01T10:35:00Z", "Average": 182.19999999999999, "Unit": "Count" }, { "Timestamp": "2017-03-01T05:30:00Z", "Average": 180.19999999999999, "Unit": "Count" } ], "Label": "DatabaseConnections" } END_JSON my $data = decode_json($json); my $csv = Text::CSV->new({auto_diag=>2, binary=>1, eol=>"\n", always_quote=>1 }); my @fields = qw/ Timestamp Average Unit /; $csv->print(select, \@fields); for my $datapoint ( @{ $data->{Datapoints} } ) { $csv->print(select, [ map {$datapoint->{$_}} @fields ]); }