我需要将Json文件转换为可读的csv

时间:2015-06-30 02:52:15

标签: json perl csv

我得到了这个应该读取我的类别并将它们放入csv文件的Perl代码。经过多次尝试,我终于得到了它,但只准备了我的500多个类别中的50个。以任何方式修改此例程以读取我的所有类别。

以下是我从Bigcommerce论坛获得的Perl文件。

use strict;
use JSON::PP;

open (my $fh, "<", 'categories.json');
my $json_text = <$fh>;
my $perl_scalar = decode_json($json_text);


# Make a list of ids to names, so that I can build a content path for Neto    category CSV

my $id;
foreach my $element (@$perl_scalar)
{
         $id->{$element->{id}}=$element->{name};
}

# Actually print out the CSV content, in Neto's required format.



print "content type,content path,name,description 1,description 2,sort order,seo meta description,seo page title,seo meta keywords\n";

 foreach my $element (@$perl_scalar)
{
       print "Product Category,";
       my $parent_category = $element->{parent_category_list}[0];
       if ($parent_category == $element->{id})
       {
            print ",";
        }
       else
       {
            print $id->{$parent_category}, ",";
        }
       print $element->{name}, ",", $element->{description}, ",,", $element->{sort_order}, ",", $element->{meta_description}, ",,\n";
        } 

提前致谢

1 个答案:

答案 0 :(得分:0)

将JSON映射到CSV有一个非常基本的问题。 JSON是嵌套数据结构,其中CSV不是。因此,你总是不得不搞砸转换 - 你将如何得到好转:

{
    "data2" : { 
        "fish" : "paste"
    },
    "data" : [
         { 
             "somesub" : "somethingelse" 
         },
         {
             "somesub" : "anotherthing" 
         }
    ]
}

这不会轻易变成像CSV这样的平面数据结构。

如果你有一些琐碎的 JSON要转换,那不是太难,但是依赖于完全你的JSON文件的结构,以及你想要如何映射东西

一个简单的例子:

use strict;
use warnings;
use JSON;
use Data::Dumper;

local $/;
my $data = from_json(<DATA>);
print Dumper $data;

my @columns = qw ( col1 col2 col3 );

print join( ",", "key", @columns ), "\n";
foreach my $key ( sort keys %$data ) {
    print join( ",", $key, @{ $data->{$key} }{@columns} ), "\n";
}


__DATA__
{
  "1" : 
     {
    "col1" : "value1",
    "col2" : "value2",
    "col3" : "value3"
    },
      "2" : {
        "col1" : "value4",
        "col2" : "value5",
        "col3" : "value6" 
    }
}

对于更复杂的示例 - 使用Text::CSV可能是合适的 - 但这取决于您的JSON内容中的内容 - 上面的简单join方法无法处理换行符,嵌入式引号或文本中的逗号。因此,最好使用Text::CSV

#!/usr/bin/env perl
use strict;
use warnings;
use JSON;
use Text::CSV;
use Data::Dumper;

local $/;
my $data = from_json ( <DATA> );
print Dumper $data;

my $csv = Text::CSV -> new ( { 'binary' => 1 } );
my @columns = qw ( col1 col2 col3 );
$csv -> column_names ( @columns );

foreach my $key ( sort keys %$data ) {
    $csv -> print_hr ( \*STDOUT, $data->{$key} );
    print "\n";
}

foreach my $key ( sort keys %$data ) {
    my $row = [ $key, @{$data->{$key}}{@columns} ];
    $csv -> print ( \*STDOUT, $row );
    print "\n";
}

这使用与上面相同的__DATA__块,并且还运行两次 - 一次使用'列标题'进行打印 - 如果您不想保留“键”字段,则可以运行两次汇编打印的数组引用。