【问题标题】:Converting JSON to .csv将 JSON 转换为 .csv
【发布时间】:2015-03-18 19:32:04
【问题描述】:

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

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

有没有一种方法可以获取一些数据并将其转换为 .csv?特别是“夹具历史”?

提前感谢您的帮助:)

【问题讨论】:

  • 也许对你有帮助convertcsv.com/json-to-csv.htm
  • 你想把它转换成代码吗?如果是这样,您使用什么语言?
  • 感谢您的回复,我是新手。我想将一些数据外推到 .csv 中,这样我就可以使用表格中的数据,特别是“夹具历史”。我想知道你是否可以看看并给我一些关于如何做到这一点的指示?
  • JSON 是一种比 CSV 更详细的数据格式 - 它允许更复杂的数据结构。如果你这样做,不可避免地会“丢失细节”。因此,您想到的输出示例将很有用。每个球员都有多个灯具 - 您会考虑为每个灯具一列,还是为每个灯具一个行?

标签: json csv


【解决方案1】:

这是使用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

【讨论】:

    【解决方案2】:

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

    如果您想自动获取它 - 这是可行的,但我跳过了它,因为“执行”https URL 稍微复杂一些。

    因此,假设您已经下载了文件,这里有一个可能的 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 对数据结构类型的术语)。 hashes 是键值对。

    所以我们从这个哈希中提取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, 
    

    这有意义吗?

    【讨论】:

    • 您好 Sobrique,tahnsk 非常感谢您的回复,非常感谢。但是,我还没有设法保存 JSON 文件!我将如何在 Perl 中做到这一点?一旦我做到了,那么我可以试试你上面的方法!谢谢:)
    • 在浏览器中打开它,“另存为”将是迄今为止最简单的。否则,您正在考虑使用LWP::UserAgent 获取一些https 数据。我尝试了一个示例,但它没有工作,所以没有发布它:)
    • 嗨 Sobrique,再次感谢 :) 我设法下载了 JSON 文件 :) 我正在使用 ipython,并在上面复制了您的代码。我将 JSON 文件所在的目录放在上面代码的“players.json”部分中,我认为这是正确的。但是,我在 ipython 中收到以下错误:文件“”,第 3 行使用严格; ^ SyntaxError: 无效语法
    【解决方案3】:

    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(),只需将您希望数据点占据的行中的位置作为第一个参数。

    【讨论】:

    • 嗨,布伦南,太棒了,谢谢。我将如何使用上面的代码将“名字”、“姓氏”等添加到此表中?我将如何调整上面的代码来获取名字、姓氏、固定装置等?
    • 嘿@Johnliquid,我刚刚编辑了答案以包含插入其他数据的方法。让我知道这是否有帮助。另外,如果我的解决方案对你有用,请接受我的回答,这样我就可以得到积分:)
    • 您好布伦南,感谢您的回复。我刚刚像以前一样尝试了您的更新,命令提示符中显示了以下错误:文件“fix_hist.py”,第 17 行,在 f.writerow UnicodeEncodeError: 'ascii' codec can't encode character u' xe1' 在第 4 位:序数不在范围内
    • 我在运行代码时遇到了同样的错误,但仍然创建了 csv 文件。让我看看为此编写一个处理程序...
    • 感谢 Brennan,我检查了 .csv,它只下载了 29 名球员的部分数据,而不是从第一个球员开始(联盟中有近 600 名球员)。非常感谢您的帮助!
    猜你喜欢
    • 2015-08-23
    • 2019-08-21
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多