1

我使用 perl 脚本将 JSON 转换为 csv。示例 json 是这样的,

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

我用来将其转换为 csv 的 perl 代码是,

#!/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"} } . '"'; 

但它只返回计数而不是元素。

请帮我解决这个问题。

谢谢!

4

1 回答 1

0

颠覆你诚实尝试的一个细节是优先级。在

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;
    
  • 要 slurp 文件,您也可以这样做

    my $json = do {
        local $/;
        open my $fh, '<', 'output_array.json' or die $!;
        <$fh>;
    };
    
于 2018-11-30T06:06:51.663 回答