我得到了这个应该读取我的类别并将它们放入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";
}
提前致谢
答案 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__
块,并且还运行两次 - 一次使用'列标题'进行打印 - 如果您不想保留“键”字段,则可以运行两次汇编打印的数组引用。