2015-06-30 3 views
1

Я получил этот код Perl, который должен читать мои категории и помещать их в файл csv. После многих попыток я, наконец, получил его, но только 50 из моих более 500 категорий. Любой способ изменить эту процедуру, чтобы прочитать все мои категории.Мне нужно преобразовать 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

Добро пожаловать в переполнение стека. Обычно, если вы задаете здесь вопрос, вы должны показать, что вы пробовали, и объяснить, в чем проблема. Вы можете увидеть [faq] и взять [тур] (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__ блок, как описано выше, а также работает дважды - один раз с помощью «заголовки столбцов» для печати - которая работает при условии, вы не хотите, чтобы сохранить поле «ключ», а второе, которое собирает ссылку на массив для печати.

Смежные вопросы