2015-06-30 48 views
1

我得到的是应该读我的类别,并把它们放在一个CSV文件,这个Perl代码。经过多次尝试后,我终于获得了它,但只准备了超过500个类别中的50个。任何方式来修改这个例程来阅读我所有的类别。我需要一个JSON文件转换成可读的CSV

这里是Perl文件我从论坛的Bigcommerce了。

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

我敢肯定这是Perl代码,而不是PHP。 –

+1

欢迎来到Stack Overflow。通常如果你在这里问一个问题,你应该展示你的尝试,并解释问题是什么。你可以看到[faq]并参加[tour](http://stackoverflow.com/tour)。我不认为你熟悉编程,所以这可能不会帮助你。 – simbabque

+0

**这里有一个技巧,但:**程序读取一个叫做'categories.json'文件,我相信你知道如何运行该程序。它所做的只是从该JSON文件中读取和重新排列数据。找出该文件的创建位置,并从您自己的系统中重新生成该文件。在Bigcommerce社区中询问。因为该文件只有这50个类别。如果它有你的所有类别,它会做你想做的。 – simbabque

回答

0

没有与映射到JSON CSV一个漂亮的根本问题。 JSON是嵌套的数据结构,其中CSV不是。因此,你将永远有惹转换周围 - 你会怎么colliminate:

{ 
    "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__块如上,并且还运行两次 - 使用“列标题”打印一次 - 这作品只要你不希望保留“键”字段,第二个则组装数组引用以进行打印。

相关问题