ошибка при преобразовании массива JSON в CSV с использованием Perl - PullRequest
0 голосов
/ 30 ноября 2018

Я использую Perl-скрипт для преобразования из JSON в CSV.sampple json выглядит следующим образом:

[{"id":100,
"primary-codes":["E0181V00","E0226V00"],
"substitute-codes":["E0181D00","E0226100"],
"fk-id":2294}]

, а код perl, который я использовал для преобразования этого в csv:

#!/usr/bin/perl
use utf8;
use warnings;
use strict;
use lib '.';
use JSON::PP qw(decode_json);

my $json;
{
local $/;
open my $fh, '<', 'output_array.json' or die $!;
$json = <$fh>;
}

my $perl = decode_json $json;
my $filename = 'sample.csv';
open(my $fh, '>>:encoding(UTF-8)', $filename) or die "Could not open file '$filename' $!";
say $fh 'nk_id,prim_cd,sub_cd,fk_id';

for (@$perl){
my $nk_id = '"' . $_->{"id"} . '"';
my $prim_cd= '"' . $_->{"primary-codes"} . '"';                
my $sub_cd= '"' . $_->{"substitute-codes"} . '"'; 
my $fk_id= '"' . $_->{"fk-id"} . '"';                                  

say $fh "$nk_id," . "$prim_cd," . "$sub_cd," . "$fk_id";
}
close $fh;

Вывод, который я получаю, выглядит следующим образом:

nk_id,prim_cd,sub_cd,fk_id
100,ARRAY(0x201549f8),ARRAY(0x20154a88),2294

но я хочу, чтобы это было,

100,"E0181V00,E0226V00","E0181D00,E0226100",2294

Я пытался использовать,

my $prim_cd = '"' . join ",", @{ $perl->[0]{"primary-codes"} } . '"'; 

Но он просто возвращает количество, а не элементы.

Пожалуйста, помогите мне с этим вопросом.

Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

Единственная деталь, которая подорвала вашу честную попытку, - это приоритет.В

my $prim_cd = '"' . join ",", @{ $perl->[0]{"primary-codes"} } . '"';

список @{ $perl->[0]...} сначала объединяется (.) с ", и, поскольку оператор . налагает скалярный контекст, используется количество элементов в списке, приводя к 2".Только тогда join делает свое дело, «присоединяясь» к данному списку (который является одним элементом, 2")

Просто добавьте скобку

for (@$perl){
    my $nk_id   = '"' . $_->{"id"} . '"';
    my $prim_cd = '"' . join(',', @{$_->{'primary-codes'}}) . '"';
    my $sub_cd  = '"' . join(',', @{$_->{'substitute-codes'}}) . '"'; 
    my $fk_id   = '"' . $_->{"fk-id"} . '"'; 
    say $fh "$nk_id,$prim_cd,$sub_cd,$fk_id";
}

Несколько замечаний.

  • Вы забыли use feature qw(say);, без которого say не будет работать.

  • То, что показано, не использует use utf8;, что касается самого исходного файла

  • То, что показано, не нужно use lib;это указывает пути для поиска модулей.(Это не поможет в поиске файлов, если это была идея.).Однако, как только мы это сделаем ...

  • Я избегаю использования ., так как это может создать проблемы, начиная от путаницы до прямых ошибок.Например, вы имеете в виду текущий рабочий каталог или каталог скрипта?Они не одинаковы.Предполагая, что вы используете его для директории скрипта (а это не так), замените его на

    use FindBin qw($RealBin);
    use lib $RealBin;
    
  • Для того, чтобы украсть файл, вы также можете сделать

    my $json = do {
        local $/;
        open my $fh, '<', 'output_array.json' or die $!;
        <$fh>;
    };
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...