将JSON转换为.csv

时间:2015-03-18 19:32:05

标签: json csv

我发现有人正在下载到JSON文件中的一些数据(我想! - 我是新手!)。该文件包含近600名足球运动员的数据。

这是文件:https://raw.githubusercontent.com/llimllib/fantasypl_stats/f944410c21f90e7c5897cd60ecca5dc72b5ab619/data/players.1426687570.json

有没有办法可以获取部分数据并将其转换为.csv?特别是'夹具历史'?

提前感谢您的任何帮助:)

3 个答案:

答案 0 :(得分:5)

以下是使用jq

的解决方案

如果文件filter.jq包含

  .[]
| {first_name, second_name, all:.fixture_history.all[]}
| [.first_name, .second_name, .all[]]
| @csv

data.json包含示例数据,然后是命令

jq -M -r -f filter.jq data.json 

将产生输出(注意这里只显示10行)

"Wojciech","Szczesny","16 Aug 17:30",1,"CRY(H) 2-1",90,0,0,0,1,0,0,0,0,0,1,0,13,7,0,55,2
"Wojciech","Szczesny","23 Aug 17:30",2,"EVE(A) 2-2",90,0,0,0,2,0,0,0,0,0,0,0,5,9,-9306,55,1
"Wojciech","Szczesny","31 Aug 16:00",3,"LEI(A) 1-1",90,0,0,0,1,0,0,0,1,0,2,0,7,15,-20971,55,1
"Wojciech","Szczesny","13 Sep 12:45",4,"MCI(H) 2-2",90,0,0,0,2,0,0,0,0,0,6,0,12,17,-39686,55,3
"Wojciech","Szczesny","20 Sep 15:00",5,"AVL(A) 3-0",90,0,0,1,0,0,0,0,0,0,2,0,14,22,-15931,55,6
"Wojciech","Szczesny","27 Sep 17:30",6,"TOT(H) 1-1",90,0,0,0,1,0,0,0,0,0,4,0,10,13,-5389,55,3
"Wojciech","Szczesny","05 Oct 14:05",7,"CHE(A) 0-2",90,0,0,0,2,0,0,0,0,0,1,0,3,9,-8654,55,1
"Wojciech","Szczesny","18 Oct 15:00",8,"HUL(H) 2-2",90,0,0,0,2,0,0,0,0,0,2,0,7,9,-824,54,1
"Wojciech","Szczesny","25 Oct 15:00",9,"SUN(A) 2-0",90,0,0,1,0,0,0,0,0,0,3,0,16,22,-11582,54,7

答案 1 :(得分:1)

JSON是比CSV更详细的数据格式 - 它允许更复杂的数据结构。如果你这样做,你就不可避免地会失去细节。

如果你想自动获取它 - 这是可行的,但我已经跳过了它,因为'做'https网址稍微复杂一些。

所以假设你已经下载了你的文件,这里有一个可能的Perl解决方案(你已经有了一个用于Python的解决方案 - 两者都是非常强大的脚本语言,但几乎可以涵盖相同的基础 - 所以它也是一个问题你使用的味道)。

#!/usr/bin/perl

use strict;
use warnings;
use JSON;

my $file = 'players.json';

open( my $input, "<", $file ) or die $!;

my $json_data = decode_json(
    do { local $/; <$input> }
);
foreach my $player_id ( keys %{$json_data} ) {
    foreach my $fixture (
        @{ $json_data->{$player_id}->{fixture_history}->{all} } )
    {
        print join( ",",
            $player_id, $json_data->{$player_id}->{web_name},
            @{$fixture}, "\n", );
    }

}

希望您可以看到这里发生了什么 - 您加载文件$inputdecode_json来创建数据结构。

此数据结构是嵌套的hash(perl的数据结构类型的术语)。 hash是密钥值对。

因此我们从此哈希中提取keys - 这是每个条目开头的ID号。

然后我们遍历每一个 - 提取fixture_history数组。对于该数组中的每个元素,我们会打印播放器ID,web_name,然后打印fixture_history中的数据。

这给出了输出:

1,Szczesny,10 Feb 19:45,25,LEI(H) 2-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2413,52,0,
1,Szczesny,21 Feb 15:00,26,CRY(A) 2-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2805,52,0,
1,Szczesny,01 Mar 14:05,27,EVE(H) 2-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1862,52,0,
1,Szczesny,04 Mar 19:45,28,QPR(A) 2-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1248,52,0,
1,Szczesny,14 Mar 15:00,29,WHU(H) 3-0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1897,52,0, 

这有意义吗?

答案 2 :(得分:0)

Python有一些很好的库可以做到这一点。如果将以下代码复制到文件中并将其另存为 fix_hist.py 或其他内容,则将JSON文件另存为 file.json 在同一目录中,它将创建包含夹具历史记录的csv文件,每个文件都保存为一行。只需在命令提示符(或mac终端)中运行python fix_hist.py

import csv
import json

json_data = open("file.json")
data = json.load(json_data)

f = csv.writer(open("fix_hists.csv","wb+"))

for i in data:
    fh = data[i]["fixture_history"]
    array = fh["all"]
    for j in array:
        f.writerow(j)

json_data.close()

要向夹具历史记录添加其他数据,可以在写入行之前添加插入语句:

import csv
import json

json_data = open("file.json")
data = json.load(json_data)

f = csv.writer(open("fix_hists.csv","wb+"))

arr = []

for i in data:
    fh = data[i]["fixture_history"]
    array = fh["all"]
    for j in array:

        try:
            j.insert(0,str(data[i]["first_name"]))
        except:
            j.insert(0,'error')

        try:
            j.insert(1,data[i]["web_name"])
        except:
            j.insert(1,'error')

        try:
            f.writerow(j)
        except:
            f.writerow(['error','error'])

json_data.close()

使用insert(),只需指出您希望数据点占据的行中的位置作为第一个参数。